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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 06:18:26