本文目录:
- OpenCV 读取后的图片的属性
- 实验验证
- 总结
1. OpenCV 读取后的图片的属性
使用 cv2.imread()
函数读取彩色图像后,图像的存储的数据范围是 [0, 255]
的 <class 'numpy.uint8'>
,通道顺序为 BGR
,当使用 matplotlib.pyplot
绘制时需要使用 cv2.cvtColor()
函数来转换为支持的 RGB
顺序。
读取的图片 左上角点为原点,水平向右为 X 轴正方向,垂直向下为 Y 轴正方向。
如果图片的高度是 H,宽度为 W,那么存储的数据尺寸为 (H,W,3)
,底层存储方式与我们肉眼的直观感觉是一致的。H 对应着 y 轴,W 对应着 x 轴,也就是说,使用 OpenCV 访问某一位置的像素值时,不是先确定 x
坐标再确定 y
坐标,而是相反。也就是说,对于坐标系下的 (x,y)
这一点,我们是使用 (y,x)
来访问的。
2. 实验验证
使用的上述图片高度为 328,宽度为 400,
- shape() —— 先高再宽
img = cv2.imread('dog.jpg')
print(img.shape)
>>> (328, 400, 3)
- resize() —— 先 x 再 y
img = cv2.imread('dog.jpg')
resized_img = cv2.resize(img, (0, 0), fx=0.5, fy=1.0) # 这里的fx对应着x轴,fy对应着y轴
img = cv2.imread('dog.jpg')
resized_img = cv2.resize(img, (100, 200)) # 先x轴,再y轴
在电脑中图片的属性中显示的分辨率也是先 x 再 y
- 访问像素值 —— 先高后宽
img = cv2.imread('dog.jpg')
img[:200, :300, :] = 0
3. 总结
除了在文件属性和 resize
时是以坐标轴为顺序(先宽后高),其他操作可以将其看作是普通的三维矩阵即可,第一维为行(高),第二维为列(宽),第三维为通道。