img = cv2.imread(img_path)
print(img.shape)
img = img[:, :, ::-1]
首先说cv2.imread读出来的是什么
从上图可以看出,cv2.imread返回的结果是一个三维数组,图片的高度 * 宽度 * 3,这里的3表示RGB三个通道,R--red红色,G--green绿色,B--blue蓝色。
拿出一个切片,比如红色通道,某点的值,就是图片坐标上,该点的明暗程度,图片的左上角为坐标的(0,0)点,右下角为(hmax,wmax)点。
还有这里的RGB并不是众生平等的,R占据相对重要的通道,B占据相对不重要的通道。
接下来说img = img[:, :, ::-1]
img = img[:, :, ::-1]
这句话的意思就是数组的第一个维度和第二个维度不变,第三个维度的数组翻转。
也就是说,图片的高度和宽度不变,红色通道和蓝色通道翻转,使得蓝色通道占据相对重要的通道,红色通道占据相对不重要的通道。这里注意一下,是矩阵翻转,所以是从RGB变成了BGR,中间的通道G也就是green,是一直不变的。
下面是原图,也就是RGB通道的图。
下面是翻转之后的图,也就是BGR通道的图。
下面是三个通道相互转换的方法
BGR转为RGB:rgb = bgr[...,::-1]
RGB转为BGR:bgr = rgb[...,::-1] 或 out = out[:, :, [2, 1, 0]]
RGB转为GBR:gbr = rgb[...,[2,0,1]]
最后说为什么要转换通道
1.RGB符合人类实际
2.彩色显示器,图像采集器都是RGB的
3.opencv读出来的图像默认是BGR通道,是因为caffee,是历史问题,是早年为了兼容某些硬件
更具体的参考下面网址。
https://blog.csdn.net/weixin_52527544/article/details/128008221