使用cv2.imread(url)得到的图片是BGR格式,而不是传统的RGB格式,有时需要转换。
cv2提供了转换的方法:
imgRGB = cv.cvtColor(imgBGR, cv.COLOR_BGR2RGB)
但是在实际输出时会发现,转换的RGB图像是错的。
左边是原图BGR,右边是转换得到的RGB。
这是因为在转换时,只变更了通道标记,没有交换通道数值。
比如,原图某个像素BGR是[77, 88, 99],B是77,G是88,R是99。经过转换处理变成RGB后,这个像素的数值还是[77, 88, 99],只不过原来的通道标记变了,R变成了77,G是88,B是99。
因此想要正确转换还要将B和R通道的数值也一同交换,使之变成[99, 88, 77]。
1.split拆分通道。
# 分离出B,G,R三个通道
b, g, r = cv.split(img)
# 交换B和R的位置再组合
img = cv.merge((r, g, b))
# 此时B和R通道的数值交换了,但是通道标记还是BGR
# 变更通道模式
img = cv.cvtColor(img, cv.COLOR_BGR2RGB)
# 此时再输出就是正确的RBG图像了
2.切片拆分通道。
B,G,R,分别对应img[:, :, 0],img[:, :, 1],img[:, :, 3],切出B和R通道再交换,然后更改通道模式为RGB即可。
变更通道模式和交换B和R通道的值无先后顺序。