You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:19:42