在进行图像的处理时,一定要清楚你处理的图像数据的格式
最近用到了灰度图像,由于对不同的图像读取函数内部机理不是那么清楚,导致走了很多弯路。
1、cv2.imread()函数读取灰度图像
# 加载灰度图像数据
img_gray_data = cv2.imread('./images/AN001.png')
print('数据类型:', type(img_gray_data))
print('数组类型:', img_gray_data.dtype)
print('数组形状:', img_gray_data.shape)
print('数组最大值:{},最小值:{}'.format(img_gray_data.max(), img_gray_data.min()))
结果如下:即使读取的图片为灰度图,cv2.imread()函数也会按bgr三个通道读取。这三个通道的像素值是相同的。
数据类型: <class 'numpy.ndarray'>
数组类型: uint8
数组形状: (490, 640, 3)
数组最大值:255,最小值:0
2、scm.imread()函数读取灰度图像
img = scm.imread('./images/AN001.png')
print('数据类型:', type(img))
print('数组类型:', img.dtype)
print('数组形状:', img.shape)
print('数组最大值:{},最小值:{}'.format(img.max(), img.min()))
数据类型: <class 'numpy.ndarray'>
数组类型: uint8
数组形状: (490, 640)
数组最大值:255,最小值:0
此函数读取的图像仅有一个亮度通道,需要谨慎处理。特别的设计到灰度图像和彩色图形跨域处理时。
3、scm.imresize()函数和transform.resize()函数对(490,640)二维灰度图像的处理
img_resize = scm.imresize(img, (256, 256, 3))
img_resize ==transform.resize(img, (256, 256, 3))
结果分别为:
# scm.imresize()函数
数组形状: (256, 256)
数组最大值:255,最小值:0
# transform.resize()函数
数组形状: (256, 256, 3)
数组最大值:1.0,最小值:0.0
前者对(490,640)二维数据进行了resize,而后者处理后变成了3通道数据,而且,像素值从0-255,变成了0-1,进行了归一化。