使用Python-OpenCV绘制图像直方图结果异常如何解决?
图像直方图均衡化代码修复方案
现存问题
- 重复导入
matplotlib.pyplot模块,冗余且可能引发命名冲突 - 图像路径使用未转义的反斜杠,Windows环境下反斜杠会被识别为转义字符,大概率导致图像读取失败返回None,后续操作直接出错
- 混用skimage的
io.imshow和matplotlib绘图接口,连续调用io.imshow会将内容叠加到同一个画布上,不会分开展示图像 - 仅计算绘制了原始图像的直方图,没有生成均衡后图像的直方图,不符合需求
- 没有为不同可视化内容创建独立子图/画布,所有绘图内容堆叠导致结果异常
修复后完整代码
import cv2 import numpy as np import matplotlib.pyplot as plt # 读取灰度图像,使用原始字符串避免路径转义问题 gray = cv2.imread(r"folder\img1.jpg", 0) # 校验图像是否读取成功 if gray is None: raise FileNotFoundError("图像路径有误,请检查路径配置") # 执行直方图均衡化 equ = cv2.equalizeHist(gray) # 创建2行2列布局的子图,统一管理所有绘图内容 plt.figure(figsize=(12, 8)) # 展示原始灰度图 plt.subplot(2, 2, 1) plt.imshow(gray, cmap='gray') plt.title('原始灰度图像') plt.axis('off') # 展示均衡化后图像 plt.subplot(2, 2, 2) plt.imshow(equ, cmap='gray') plt.title('直方图均衡化后图像') plt.axis('off') # 绘制原始图像直方图 plt.subplot(2, 2, 3) hist_gray = cv2.calcHist([gray], [0], None, [256], [0, 256]) plt.plot(hist_gray, color='gray') plt.title('原始图像直方图') plt.xlabel('像素值') plt.ylabel('像素数量') # 绘制均衡化后图像直方图 plt.subplot(2, 2, 4) hist_equ = cv2.calcHist([equ], [0], None, [256], [0, 256]) plt.plot(hist_equ, color='black') plt.title('均衡化后图像直方图') plt.xlabel('像素值') plt.ylabel('像素数量') # 自动调整子图间距避免内容重叠 plt.tight_layout() plt.show()
改动说明
- 路径改用原始字符串格式,也可以替换为正斜杠写法
"folder/img1.jpg",避免转义问题 - 统一使用matplotlib接口绘图,为所有可视化内容分配独立子图,解决内容堆叠异常的问题
- 新增图像读取校验逻辑,提前捕获路径错误问题
- 补充均衡后图像的直方图计算和绘制逻辑,匹配需求
- 为每个子图添加标题和坐标轴说明,提升结果可读性
内容的提问来源于stack exchange,提问作者HelloWorldd
相关产品推荐
相关产品推荐

