OpenCV读取sRGB PNG时红蓝通道交换,该归咎于imread还是fromarray?
OpenCV中sRGB PNG红蓝通道交换问题解析
嗨,作为OpenCV新手碰到这个问题真的太常见啦!我来给你把事儿说清楚:
其实这既不是imread的锅,也不是fromarray的错,本质是OpenCV和大多数图像工具的通道顺序约定不一样:
- OpenCV的
cv2.imread()函数默认会把彩色图像读取成BGR通道顺序,这是它一直以来的设计习惯; - 而sRGB格式(包括像PIL、matplotlib这类常用图像库)都是遵循RGB通道顺序的。
所以如果你用cv2.imread()读入sRGB PNG后,直接把数组传给依赖RGB顺序的工具(比如用fromarray配合matplotlib显示),就会出现红蓝通道颠倒的情况。
给你个简单的解决办法:读入图片后,用OpenCV自带的通道转换函数把BGR转成RGB就好啦,示例代码如下:
import cv2 import matplotlib.pyplot as plt # 读入BGR格式的图像 img_bgr = cv2.imread("你的sRGB图片.png") # 转换为RGB格式 img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB) # 再用fromarray或者matplotlib显示就正常了 plt.imshow(img_rgb) plt.show()
简单总结下:OpenCV读出来的是BGR,其他工具大多认RGB,转个通道就搞定啦!
内容的提问来源于stack exchange,提问作者dom free
相关产品推荐
相关产品推荐

