1.导入必要的库
import numpy as npimport scipy%matplotlib inlineimport matplotlib.pyplot as plt
2.加载图片
image = matplotlib.pyplot.imread('../datas/f4.jpg') #读入的是灰度图像
3.查询图像数据几何数据和像素数量
# 图像的高和宽rows,cols = image.shape # 图像的像素数量,对于灰度图像和二图像pixels = rows*cols,对于RGB或RGBA图像:pixel=rows * cols * channelspixels = image.size
4.查询图像统计信息
# 像素最大和最小值print('max pixel value = %d,min pixel value = %d' % (camera.max(),camera.min()))# 整个图像像素均值print('mean = %f' % camera.mean())
5.图像像素索引
图像像素在通过Numpy的NDArray表示,操作方式和操作普通矩阵没有什么区别。 例如。在这里需要注意的一点是,image.shape[0]表示图像的行,image.shape[1]表示图像的列。访问图像的第10行,第20列的像素(Slicing操作):
print('pixel at image(10,20) = %d' % (image[10,20]))
设置前10行为黑色:
image[0:10] = 0
Masking操作(通过布尔值来索引),例如,灰度图像二值化: 查找图像所有小于87的像素值,半把这些像素设置为255:
mask = image < 87image[mask] = 255
优雅索引(通过坐标集来索引),例如:
index_r = np.arange(len(image))index_c = 4 * index_r % len(image)image[index_r,index_c] = 0
使用Mask方式对图像索引,特别是需要对图像像素进一步操作时,相当方便。Mask可以任何与图像大小相同的boolean值数组或者可以广播成图像大小的boolean数组。例如,定义图像兴趣区域(ROI):
camera = plt.imread('../datas/f2.jpg')nrows,ncols = camera.shaperow,col = np.ogrid[:nrows,:ncols]cnt_row,cnt_col = nrows / 2,ncols / 2outer_disk_mask = ((row - cnt_row) ** 2 + (col - cnt_col) ** 2 > (nrows / 2) ** 2)camera[outer_disk_mask] = 0
6.彩色图像
彩色图像也可能使用Numpy的数组来表示,只不过比灰度图像多了一个维度。
cat = plt.imread('../datas/cat.jpg')print('shape of clolor image = ',cat.shape)
对像素的索引区别不大,只不过彩色图像返回的是RGB或其他彩色空间类型值
# R、G、B分量print('pixel = ',cat[10,20])#设置第50行第60列的像素为0cat[50,60] = 0# 设置第50行第60列的像素为绿色cat[50,60] = [0,255,0]
对彩色图像,同样可以使用Mask方式索引,例如:
cat = data.chelsea()# 对图像第一个通道像素进行Mask索引reddish = cat[:,:,0] > 160cat[reddish] = [0,255,0]plt.imshow(cat)
7.坐标约定
由于我们使用Numpy array来表示图像,所以图像的坐标必须同Numpy的array相对应。如下所示:
图像类型 | 坐标 |
---|---|
2D灰度图像 | (row,col ) |
2D多通道图像 | (row,col,ch ) |
3D灰度图像 | (pln,row,col ) |
3D多通道图像 | (pln,row,col,ch ) |