使用pcolormesh绘制RGB图像结果异常的原因及解决方法
问题核心原因
你的代码存在4个核心错误,直接导致输出图像异常:
- 错误使用
pcolormesh叠图层:单次pcolormesh调用只能绘制单通道数值映射到色阶的结果,连续三次调用分别传入R/G/B通道时,后绘制的图层会直接覆盖前层,根本不会自动合并成RGB图像,最后显示的本质是最后传入的蓝色通道套上默认viridis色图的效果,自然会出现偏绿的怪异色彩。 - 坐标系方向不匹配:
pcolormesh默认坐标原点在左下角,而常规图像存储的原点在左上角,直接绘制必然出现上下翻转的问题。 - 通道对应关系错误:CIFAR-10加载的原始数据本身就是RGB通道顺序,你代码里写
blue,green,red = cv2.split(x),相当于把原R通道当成B通道、原B通道当成R通道,色彩通道完全错位。 - 数值类型触发自动归一化:你把数组转成
float32后没有约束值范围,matplotlib对浮点型单通道绘图数据会自动按极值做归一化映射,进一步造成色彩偏移。另外你的代码里变量i没有定义,直接运行会报错。
解决方案
如果没有自定义网格坐标的特殊需求,直接用plt.imshow()绘制RGB图像是最简便的方案,不需要手动处理通道、坐标系适配问题:
import matplotlib.pyplot as plt from tensorflow.keras.datasets import cifar10 (x_train, y_train), (x_test, y_test) = cifar10.load_data() i = 0 # 定义要显示的测试集样本索引 x = x_test[i] plt.figure(figsize=(3,3)) plt.imshow(x) plt.axis('off') plt.show()
如果你必须使用pcolormesh绘制(比如需要绑定非均匀网格、叠加地理坐标等场景),不要拆分通道分三次调用,通过facecolors参数一次性传入RGB颜色值即可,参考代码如下:
import matplotlib.pyplot as plt import numpy as np from tensorflow.keras.datasets import cifar10 (x_train, y_train), (x_test, y_test) = cifar10.load_data() i = 0 x = x_test[i] h, w = x.shape[:2] plt.figure(figsize=(3,3)) # 32*32像素需要对应33*33的网格节点 x_grid = np.arange(w+1) y_grid = np.arange(h+1) plt.pcolormesh( x_grid, y_grid, np.zeros((h, w)), # 数值数组占位,实际显示颜色由facecolors控制 facecolors=x/255, # RGB值转成0-1范围的浮点格式 shading='flat' ) # 翻转Y轴,匹配图像左上角原点的显示规则 plt.gca().invert_yaxis() plt.axis('off') plt.show()
注意事项
- 传入
facecolors的RGB值必须是0-1区间的浮点值,超出范围会被截断造成色彩异常。 - 不要拆分通道重复调用
pcolormesh,三通道颜色需要一次性传入。 - 只要是绘制常规位图,优先选择
imshow接口,pcolormesh本身是为二维数值场可视化设计的,不是专门的RGB图像绘图接口。
内容的提问来源于stack exchange,提问作者박사원
相关产品推荐
相关产品推荐

