赞
踩
PIL<cv2<skimage
skimage全称是scikit-image SciKit (toolkit for SciPy) ,它对scipy.ndimage进行了扩展,提供了更多的图片处理功能。scikit-image是基于scipy的一款图像处理包,它将图片作为numpy数组进行处理,正好与matlab一样。
https://blog.csdn.net/u012300744/article/details/80083282
python提供的图像处理包有PIL,Pillow, opencv, scikit-image,PIL和Pillow只提供最基础的数字图像处理,功能有限;opencv实际上是一个c++库,只是提供了python接口,更新速度非常慢。
io 读取、保存和显示图片或视频
import skimage.io as io or from skimage import io
- imread:
-
- from PIL import Image as img
- from skimage import io
- #Image和skimage读图片
- img_file1 = img.open('./1.png')#<class 'PIL.PngImagePlugin.PngImageFile'> (width, height)
- img_file2 = io.imread('./1.png')#<class 'numpy.ndarray'> (height,width, channel)
- #img=io.imread('d:/dog.jpg',as_grey=True)#获取灰度图
-
- #得到像素:
- print(img_file1.getpixel((500,1000))) #((w,h)) 返回: (253, 251, 239) tuple
- print(img_file2[500][1000]) #[h][w]
NOTE:
imread得到的img,类型是ndarray
所以img有ndarray的所有属性:
print(img.shape) #显示尺寸 rows,cols,dims=img.shape rows,cols=img.shape[:2] print(img.shape[0]) #图片高度 print(img.shape[1]) #图片宽度 print(img.shape[2]) #图片通道数 print(img.size) #显示总像素个数 print(img.max()) #最大像素值 print(img.min()) #最小像素值 print(img.mean()) #像素平均值 print(img[0][0])#图像的像素值彩色图访问:img[i,j,c] 行列通
彩图单通道访问:R=img[:,:,0] 单通道全部赋值:img[x,y,:]=255
灰度图访问:gray[i,j] 因为是个numpy array。所以访问用[ ]
裁剪:roi=img[80:180,100:200,:]
img[i,:] = im[j,:] # 将第 j 行的数值赋值给第 i 行
img[:,i] = 100 # 将第 i 列的所有数值设为 100
img[:100,:50].sum() # 计算前 100 行、前 50 列所有数值的和
img[50:100,50:100] # 50~100 行,50~100 列(不包括第 100 行和第 100 列)
img[i].mean() # 第 i 行所有数值的平均值
img[:,-1] # 最后一列
img[-2,:] (or im[-2]) # 倒数第二行
批量赋值:
reddish = img[:, :, 0] >170
img[reddish] = [0, 255, 0]遍历像素值:
rows,cols=img_gray.shape
for i in range(rows):
for j in range(cols):
if (img_gray[i,j]<=0.5):
img_gray[i,j]=0
else:
img_gray[i,j]=1
io.imshow(img) dst=io.imshow(img) #dst 类型是'matplotlib.image.AxesImage'
io.show() #important!!在窗口上绘制完图片后,返回一个AxesImage对象。要在窗口上显示这个对象,我们可以调用show()函数来进行显示,但进行练习的时候(ipython环境中),一般我们可以省略show()函数,也能自动显示出来。但是显示图像通常用matplotlib:
plt.imshow(img)
plt.show()
io.ImageCollection
- from skimage import data_dir,io,transform,color
- import numpy as np
- def convert_gray(f):
- rgb=io.imread(f) #依次读取rgb图片
- gray=color.rgb2gray(rgb) #将rgb图片转换成灰度图
- dst=transform.resize(gray,(256,256)) #将灰度图片大小转换为256*256
- return dst str=data_dir+'/*.png'
- coll = io.ImageCollection(str,load_func=convert_gray)
- for i in range(len(coll)):
- io.imsave('d:/data/'+np.str(i)+'.jpg',coll[i]) #循环保存图片
- 图像的形变与缩放
- 图像的形变与缩放,使用的是skimage的transform模块,函数比较多,功能齐全。
- 1、改变图片尺寸resize
- 函数格式为:
-
- skimage.transform.resize(image, output_shape)
- image: 需要改变尺寸的图片
- output_shape: 新的图片尺寸
-
- from skimage import transform,data
- import matplotlib.pyplot as plt
- img = data.camera()
- dst=transform.resize(img, (80, 60))
- plt.figure('resize')
- plt.subplot(121)
- plt.title('before resize')
- plt.imshow(img,plt.cm.gray)
- plt.subplot(122)
- plt.title('before resize')
- plt.imshow(dst,plt.cm.gray)
- plt.show()
data 提供一些测试图片和样本数据
- skimage程序自带了一些示例图片,如果我们不想从外部读取图片,就可以直接使用这些示例图片:
-
- astronaut 航员图片 coffee 一杯咖啡图片
- lena lena美女图片 camera 拿相机的人图片
- coins 硬币图片 moon 月亮图片
- checkerboard 棋盘图片 horse 马图片
- page 书页图片 chelsea 小猫图片
- hubble_deep_field 星空图片 text 文字图片
- clock 时钟图片 immunohistochemistry 结肠图片
- 查看所在路径:
-
- from skimage import data_dir
- print(data_dir)
color 颜色空间变换
颜色空间有灰度空间、rgb空间、hsv空间和cmyk空间。颜色空间转换以后,图片类型都变成了float型。
print(img.dtype.name) 查看
img_gray=color.rgb2gray(img) 彩图转灰度图,image_gray 类型是ndarray数组,但是数据是[0,1]间float64,需要变成普通的0-256
- skimage.color.rgb2grey(rgb)
- skimage.color.rgb2hsv(rgb)
- skimage.color.rgb2lab(rgb)
- skimage.color.gray2rgb(image)
- skimage.color.hsv2rgb(hsv)
- skimage.color.lab2rgb(lab)
- 实际上,上面的所有转换函数,都可以用一个函数来代替
- skimage.color.convert_colorspace(arr, fromspace, tospace)
- hsv=color.convert_colorspace(img,'RGB','HSV')
- skimage.color.label2rgb(arr), 可以根据标签值对图片进行着色。以后的图片分类后着色就可以用这个函数。
- gray->label->rgb
- from skimage import io,data,color
- import numpy as np
- img=data.astronaut()
- gray=color.rgb2gray(img)
- rows,cols=gray.shape
- labels=np.zeros([rows,cols])
- for i in range(rows):
- for j in range(cols):
- if(gray[i,j]<0.4):
- labels[i,j]=0
- elif(gray[i,j]<0.75):
- labels[i,j]=1
- else:
- labels[i,j]=2
- dst=color.label2rgb(labels)
- io.imshow(dst)
- io.show()
dst=transform.resize(img, (80, 60))
skimage.transform.rescale(image, scale[, ...])
scale参数可以是单个float数,表示缩放的倍数,也可以是一个float型的tuple\list,如[0.2,0.5],表示将行列数分开进行缩放
transform.rotate(image, angle[, ...],resize=False)
angle参数是个float类型数,表示旋转的度数;resize用于控制在旋转时,是否改变大小 ,默认为False
以多分辨率来解释图像的一种有效但概念简单的结构就是图像金字塔。图像金字塔最初用于机器视觉和图像压缩,一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低的图像集合。金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率的近似。当向金字塔的上层移动时,尺寸和分辨率就降低。
skimage.transform.pyramid_gaussian(image, downscale=2) 高斯金字塔
downscale控制着金字塔的缩放比例
skimage.transform.pyramid_laplacian(image, downscale=2) 拉普拉斯金字塔
- import numpy as np
- import matplotlib.pyplot as plt
- from skimage import data, transform
-
- image = data.astronaut() # 载入宇航员图片
- rows, cols, dim = image.shape # 获取图片的行数,列数和通道数
- pyramid = tuple(transform.pyramid_gaussian(image, downscale=2)) # 产生高斯金字塔图像#共生成了log(512)=9幅金字塔图像,加上原始图像共10幅,pyramid[0]-pyramid[1]
- composite_image = np.ones((rows, cols + int(cols / 2), 3), dtype=np.double) # 生成背景composite_image[:rows, :cols, :] = pyramid[0] #融合原始图像
- i_row = 0
- for p in pyramid[1:]:
- n_rows, n_cols = p.shape[:2]
- print(p.shape)
- composite_image[i_row:i_row + n_rows, cols:cols + n_cols] = p # 循环融合9幅金字塔图像
- i_row += n_rows
-
- plt.imshow(composite_image)
- plt.show()
- from skimage import viewer,data
- img = data.coins()
- viewer = viewer.ImageViewer(img)
- viewer.show()
- import skimage
- img = data.coins()
- dst=skimage.img_as_float(img)
-
- img_as_float Convert to 64-bit floating point.
- img_as_ubyte Convert to 8-bit uint.
- img_as_uint Convert to 16-bit uint.
- img_as_int Convert to 16-bit int.
exposure.adjust_gamma(image, gamma=1)
<1 亮度变亮
exposure.adjust_log(image) #对数调整 变亮
exposure.is_low_contrast(image)判断图像对比度是否偏低
newImage=exposure.rescale_intensity(image, in_range='image', out_range='dtype') 增强对比度
- in_range 表示输入图片的强度范围,默认为'image', 表示用图像的最大/最小像素值作为范围
- out_range 表示输出图片的强度范围,默认为'dype', 表示用图像的类型的最大/最小值作为范围
- 默认情况下,输入图片的[min,max]范围被拉伸到[dtype.min, dtype.max],如果dtype=uint8, 那么dtype.min=0, dtype.max=255
-
- 如果想输入图片像素值等比例缩放,用in_range
- mat=exposure.rescale_intensity(tmp,in_range=(0,255))
- 原像素值除以255,如果参数in_range的[min,max]范围要比原始像素值的范围[min,max] 大或者小,那就进行裁剪
-
- 如果一个数组里面有负数,现在想调整到正数,就使用out_range参数
- exposure.rescale_intensity(image, out_range=(0, 127))
exposure.histogram(image, nbins=256)
在numpy包中,也提供了一个计算直方图的函数histogram(),两者大同小义。np.histogram(image, bins=2)
返回一个tuple(hist, bins_center), 前一个数组是直方图的统计量,后一个数组是每个bin的中间值
nbins的意思是分成几个级别的灰度进行统计。
exposure.equalize_hist(img) 直方图均衡化
exposure.equalize_adapthist(img, kernel_size=32, clip_limit=clip_limitnumber, nbins=256) #kernel_size 可调整
如果一副图像的像素占有很多的灰度级而且分布均匀,那么这样的图像往往有高对比度和多变的灰度色调。直方图均衡化就是一种能仅靠输入图像直方图信息自动达到这种效果的变换函数。它的基本思想是对图像中像素个数多的灰度级进行展宽,而对图像中像素个数少的灰度进行压缩,从而扩展取值的动态范围,提高了对比度和灰度色调的变化,使图像更加清晰。
绘制直方图用 : img.flatten(), plt.hist(img)
feature 特征检测与提取等
filters 图像增强、边缘检测、排序滤波器、自动阈值等
draw 操作于numpy数组上的基本图形绘制,包括线条、矩形、圆和文本等
morphology 形态学操作,如开闭运算、骨架提取等
measure 图像属性的测量,如相似性或等高线等
segmentation 图像分割
restoration 图像恢复
util 通用函数
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。