OpenCV-Python默认读取图像为RGB顺序是否可行?
首先明确一点:OpenCV-Python的cv2.imread()确实默认以BGR通道顺序读取图像,官方文档的描述是准确的,并没有“偷偷”改成RGB。你遇到的显示差异,是因为不同工具对图像通道顺序的预期不同,具体拆解如下:
1. 为什么cv2.imshow显示效果和原图像一致?
cv2.imshow()是OpenCV生态里的专属显示工具,它天生就适配OpenCV的BGR格式。当你传入BGR顺序的图像数组时,它会在渲染环节自动完成BGR→RGB的转换,最终呈现出和Windows图片查看器、Photoshop一致的视觉效果。简单说就是:读入的是BGR数据,显示时内部帮你转成了RGB输出,所以肉眼看不出区别。
2. 为什么plt.imshow显示偏色?
matplotlib.pyplot.imshow()的设计逻辑是默认接收RGB顺序的图像数组。当你直接把OpenCV读的BGR数组传进去时,它会错误地把蓝色通道当成红色、红色通道当成蓝色来渲染,自然就出现了偏色。解决这个问题很简单,只需要在传给plt前转换通道顺序:
rgb_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) plt.imshow(rgb_img) plt.show()
3. 像素值对比验证
你可以直接打印图像的首个像素值来验证通道顺序:
print(img[0, 0]) # 输出的是(B, G, R)顺序的数值
对比Photoshop里的像素值(PS显示的是R, G, B),你会发现OpenCV输出的第一个数值对应PS里的B值,第二个对应G,第三个对应R——这就实锤了读取的是BGR顺序。
总结
OpenCV从底层到上层的图像处理管线都是基于BGR的(这是历史遗留原因,早期OpenCV为兼容部分硬件采用了BGR格式),它不会默认以RGB读取图像。你看到的cv2.imshow和原图像一致,只是因为显示工具和读取工具做了配套适配,底层数据依然是BGR顺序。
内容的提问来源于stack exchange,提问作者S. Aziz Kazdal

