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

图像线性缩放后如何绘制平滑的灰度直方图?

灰度拉伸后直方图离散的原因

你当前实现的是最大最小值线性灰度归一化(并非直方图均衡化,代码里的标签描述可调整),由于原始输入图像的灰度动态范围较窄,原始有效灰度级数少,拉伸映射到0~255全范围后,大量中间灰度值没有对应像素点,因此直方图会出现离散空隙与尖峰,无法呈现连续曲线形态。

直方图平滑的实用技巧
  • 调整直方图统计的bin数量
    无需强制使用256个bin逐灰度统计,可将bin数下调到32/64,相邻灰度会合并统计,直接消除离散间隔。修改cv.calcHist参数即可:
    histogram1 = cv.calcHist([img_s.astype('uint8')], [0], None, [64], [0, 256])

  • 对原始直方图做滑动均值平滑
    用卷积核处理原始256bin的直方图,消除突变的尖峰与空隙:

    # 5窗口均值平滑,窗口大小可按需调整
    kernel = np.ones(5) / 5
    smoothed_hist = np.convolve(histogram1.flatten(), kernel, mode='same')
    plt.plot(smoothed_hist, label='拉伸后图像(平滑直方图)')
    
  • 绘制核密度估计(KDE)连续曲线
    直接基于像素值绘制分布拟合曲线,跳过离散计数环节,效果最接近你预期的连续曲线:

    import seaborn as sns
    # 直接输入拉伸后的图像像素数组
    sns.kdeplot(img_s.flatten(), color='orange', label='拉伸后图像KDE曲线')
    
  • 可选:灰度拉伸时加入微小随机扰动
    如果不想修改直方图绘制逻辑,可在灰度拉伸转uint8前加入幅值极小的高斯噪声,不会影响图像观感,但能填补离散的灰度空缺:

    img_s = img_s * 255
    # 加入均值0、标准差0.3的微小噪声
    img_s = img_s + np.random.normal(0, 0.3, img_s.shape)
    img_s = img_s.astype('uint8')
    
参考素材

原始输入图像:
原始输入图像
你当前生成的原始直方图:
生成的直方图

内容的提问来源于stack exchange,提问作者Harry Spratt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 02:36:08