使用cv2.imshow()显示numpy数组图像色彩异常问题咨询
色彩显示差异的根本原因
你遇到的PIL存图色彩正常、cv2.imshow()显示偏色的问题,核心是两个库对三通道彩色numpy数组的默认通道解析规则完全不一致,和你之前做的通道均值、标准差计算结果的正确性没有关系。
- 你当前持有的
image_array是标准RGB通道顺序的数组:三通道排布固定为「第0通道=红色R、第1通道=绿色G、第2通道=蓝色B」。 - PIL库的图像IO逻辑默认以RGB顺序解析传入数组,所以你直接调用
Image.fromarray()转图再保存,通道和色彩的对应关系完全匹配,输出的图片色彩自然符合预期。 - OpenCV全链路的IO接口(包括
cv2.imread()/cv2.imshow()/cv2.imwrite())默认全部按BGR通道顺序解析三通道数组:它会默认把传入数组的第0通道识别为蓝色B、第1通道识别为绿色G、第2通道识别为红色R。你把RGB排布的数组直接传入cv2.imshow(),相当于把红色和蓝色通道的解析位置完全对调,最终显示的画面自然会出现偏色、色彩错乱的问题。
你之前了解到的「cv2.imshow展示numpy数组无需提前转换格式」是有适用前提的:只有传入的数组本身是OpenCV原生读入、未修改过通道顺序的BGR格式数组时,才不需要额外转换,并非任意格式的三通道数组都可以直接传入正常显示。
实时视频展示的实现方法
你不需要依赖PIL逐帧存图,只需要在调用cv2.imshow()前把RGB顺序的数组转成OpenCV要求的BGR顺序即可,直接调用OpenCV自带的色彩空间转换函数就行,性能完全能满足实时视频展示的要求:
# 把RGB顺序的数组转成BGR顺序后再传入imshow show_array = cv2.cvtColor(image_array, cv2.COLOR_RGB2BGR) cv2.imshow("my Array as a Pic", show_array) # 实时视频流展示必须加waitKey触发窗口刷新,否则画面会卡死 cv2.waitKey(1)
内容的提问来源于stack exchange,提问作者ShibaInu
相关产品推荐
相关产品推荐

