关于cv2.imshow()图像格式解析及自身数据格式的技术疑问
OpenCV图像显示中BGR/RGB格式的疑问解答
我将数据保存为npy文件,尝试通过以下代码显示其中的图像(data[0])以验证有效性:
import numpy as np import cv2 train_data = np.load('c:/data/train_data.npy') for data in train_data: output = data[1] # only take the height, width and channels of the 4 dimensional array image = data[0][0, :, :, :] # image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) cv2.imshow('test', image) print('output {}'.format(output)) if cv2.waitKey(25) & 0xFF == ord('q'): cv2.destroyAllWindows() break当注释掉
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)行时,显示的图像呈现BGR格式特征;启用该行后图像显示正常。我的疑问:该现象说明图像数组本身已是BGR格式,还是cv2.imshow()默认将数组按BGR格式解析?
这其实是OpenCV一个非常经典的设计特性,我来给你拆解清楚:
核心结论
这个现象说明**cv2.imshow()默认是按照BGR格式来解析输入图像数组的**,而你的图像数组本身是RGB格式的。
具体原因拆解
- 当你注释掉转换代码直接显示时,
cv2.imshow()会把输入的RGB数组当成BGR格式来解析——简单说就是把红色和蓝色通道的顺序搞反了,所以你看到的图像呈现出颜色失真的“BGR格式特征”(比如原本红色的物体显示成蓝色)。 - 当你启用
cv2.cvtColor(image, cv2.COLOR_BGR2RGB)这行代码时,本质上是把原RGB数组的通道顺序做了反转(交换红色和蓝色通道),得到了符合OpenCV期望的BGR格式数组,所以cv2.imshow()能正确解析,图像显示就正常了。
补充小知识
- OpenCV的很多图像IO相关函数(比如
cv2.imread、cv2.imwrite)都是默认以BGR格式处理图像的,这是历史遗留的设计习惯,和大多数其他图像库(比如PIL、Matplotlib)默认使用RGB格式的逻辑正好相反。 - 如果你的图像是从其他来源(比如PIL读取、深度学习模型输出)得到的RGB格式,更语义化的转换方式是用
cv2.COLOR_RGB2BGR参数,效果和COLOR_BGR2RGB完全一样,但可读性会更好,别人看代码时能直接明白是把RGB转成BGR。
内容的提问来源于stack exchange,提问作者MrYouMath
相关产品推荐
相关产品推荐

