OpenCV实现两张黑白图像直方图同图对比绘制及数据导出
灰度图直方图对比与数据导出方案
同画布展示两张灰度图像的直方图
只需分别计算两张图像的直方图,在绘图时指定不同颜色、添加图例即可区分,参考实现代码如下:
import cv2 import numpy as np from matplotlib import pyplot as plt # 读取两张灰度图像,注意:灰度模式读取请使用cv2.imread传参0,plt.imread不支持该参数 img1 = cv2.imread('first_img.jpg', 0) img2 = cv2.imread('second_img.jpg', 0) # 分别计算两张图像的灰度直方图 hist1 = cv2.calcHist([img1], [0], None, [256], [0, 256]) hist2 = cv2.calcHist([img2], [0], None, [256], [0, 256]) # 绘制折线直方图,指定红、蓝两色区分 plt.plot(hist1, color='red', label='第一张图像') plt.plot(hist2, color='blue', label='第二张图像') # 补充标注提升可读性 plt.legend() plt.xlabel('灰度值(范围0-255)') plt.ylabel('对应灰度值的像素数量') plt.xlim([0, 256]) plt.show()
如果需要更直观的占比对比,可以替换为半透明柱状图展示,将上述绘图部分代码替换为:
plt.bar(np.arange(256), hist1.flatten(), color='red', alpha=0.5, label='第一张图像') plt.bar(np.arange(256), hist2.flatten(), color='blue', alpha=0.5, label='第二张图像')其中
alpha=0.5是设置透明度,避免两个柱子完全遮挡。
导出直方图统计数据供Excel使用
cv2.calcHist()返回的是尺寸为(256,1)的numpy数组,数组第i位的数值就对应灰度值为i的像素总个数,直接将数据导出为CSV格式即可被Excel直接读取、绘图,参考代码:
import pandas as pd # 生成0-255的灰度值序列,将直方图数据压缩为一维数组匹配序列长度 gray_values = np.arange(256) hist1_data = hist1.flatten() hist2_data = hist2.flatten() # 组装为结构化数据表 hist_df = pd.DataFrame({ '灰度值': gray_values, '第一张图像像素数': hist1_data, '第二张图像像素数': hist2_data }) # 导出为CSV文件,utf-8-sig编码避免Excel打开乱码 hist_df.to_csv('gray_hist_data.csv', index=False, encoding='utf-8-sig')
如果未安装pandas,可直接用numpy导出文件:
np.savetxt( 'gray_hist_data.csv', np.column_stack((gray_values, hist1_data, hist2_data)), delimiter=',', header='灰度值,第一张图像像素数,第二张图像像素数', comments='', encoding='utf-8-sig' )
导出完成后直接用Excel打开CSV文件,选中对应数据区域即可自行插入折线图、柱状图完成自定义直方图绘制。
内容的提问来源于stack exchange,提问作者Alex Rebell
相关产品推荐
相关产品推荐

