修复Matplotlib显示OpenCV转换的实际尺寸灰度图时的ValueError问题
修复Matplotlib显示灰度图的ValueError问题
问题根源
原display_image函数默认假设输入图像是3通道(RGB/BGR),直接执行h, w, c = image.shape解包三个维度,但灰度图的shape只有**高度(h)、宽度(w)**两个维度,因此触发not enough values to unpack (expected 3, got 2)错误。
修复方案
以下提供两种兼容灰度图和彩色图的函数修改方式:
方案一:动态适配维度并处理颜色映射
import matplotlib.pyplot as plt def display_image(image): # 判断图像维度,区分灰度图与彩色图 if len(image.shape) == 2: h, w = image.shape # 灰度图需指定颜色映射,避免显示偏色 cmap = 'gray' else: h, w, _ = image.shape cmap = None # 按实际尺寸计算画布大小 dpi = plt.rcParams['figure.dpi'] figsize = w / dpi, h / dpi # 绘制图像 fig = plt.figure(figsize=figsize) ax = fig.add_axes([0, 0, 1, 1]) ax.imshow(image, cmap=cmap) plt.show()
方案二:扩展灰度图维度统一处理
如果需要保持图像维度一致(都为3D数组),可以给灰度图手动添加单通道维度:
import matplotlib.pyplot as plt def display_image(image): # 扩展灰度图维度为(h, w, 1) if len(image.shape) == 2: image = image[:, :, None] # 统一解包维度 h, w, c = image.shape dpi = plt.rcParams['figure.dpi'] figsize = w / dpi, h / dpi fig = plt.figure(figsize=figsize) ax = fig.add_axes([0, 0, 1, 1]) # 单通道图像仍需指定灰度映射 ax.imshow(image.squeeze(), cmap='gray' if c == 1 else None) plt.show()
关键说明
- 灰度图显示时必须指定
cmap='gray',否则Matplotlib会使用默认的彩色映射(如viridis),导致图像颜色失真。 - 两种方案都能同时兼容OpenCV读取的彩色图(BGR格式)和灰度图,无需额外修改调用逻辑。
内容的提问来源于stack exchange,提问作者Thurunu Mihiranga
相关产品推荐
相关产品推荐

