在Google Colab中使用OpenCV转换RGB/BGR图像为灰度图失败求助
解决plt.imshow显示灰度图出现伪色彩的问题
嘿,我之前从C++转Python用Colab做图像处理时也踩过这个一模一样的坑!你看到的绿黄蓝色彩不是灰度图本身出了问题,完全是matplotlib.pyplot.imshow()的默认渲染方式在搞鬼。
问题根源
OpenCV转出来的灰度图是单通道的8位整数数组(像素值范围0-255),但plt.imshow()默认会用viridis(就是你看到的那种绿黄蓝渐变)这种彩色颜色映射表(colormap)来渲染单通道图像,而非我们预期的灰度映射。而你的输入BGR图和转后的RGB图都是3通道的,plt能正确识别并按RGB色彩规则渲染,所以显示完全正常。
两种快速修复方案
方案1:指定灰度colormap
调用plt.imshow()时,直接加上cmap='gray'参数,同时建议搭配vmin=0和vmax=255固定像素值的映射范围,避免plt自动缩放像素值导致的亮度偏差:
import cv2 import matplotlib.pyplot as plt # 读取BGR格式原图 orig = cv2.imread('./20.png') # BGR转RGB适配plt显示 rgb = cv2.cvtColor(orig, cv2.COLOR_BGR2RGB) # RGB转灰度 gray1 = cv2.cvtColor(rgb, cv2.COLOR_RGB2GRAY) print("Input image") plt.imshow(orig) plt.show() print("\nRGB image") plt.imshow(rgb) plt.show() print("\nGrayscale image: RGB2GRAY conversion") # 关键:指定灰度colormap和值范围 plt.imshow(gray1, cmap='gray', vmin=0, vmax=255) plt.show()
方案2:直接从BGR转灰度(更高效)
其实你完全不需要先转RGB再转灰度,OpenCV支持直接从BGR格式转灰度,结果和先转RGB再转灰度完全一致,还能少一步转换操作:
# 直接从BGR原图转灰度 gray2 = cv2.cvtColor(orig, cv2.COLOR_BGR2GRAY) # 同样指定灰度colormap显示 plt.imshow(gray2, cmap='gray', vmin=0, vmax=255) plt.show()
额外小提示
如果你想验证灰度图的格式是否正确,可以用print(gray1.shape)查看输出:正常灰度图的形状应该是(图像高度, 图像宽度)的单通道结构,而RGB图的形状是(图像高度, 图像宽度, 3)的三通道结构。
内容的提问来源于stack exchange,提问作者AbsoluteNumpy
相关产品推荐
相关产品推荐

