如何优化不同形状图像在同一画布绘制直方图的效果?
如何合理对比不同尺寸图像的直方图
你遇到的问题核心在于:直接按像素数量缩放频数并没有消除样本量差异带来的分布波动,而且没有从「分布形状对比」的角度去归一化。咱们换个思路,应该把直方图转换为频率或者概率密度,这样不同尺寸的图像就能在同一基准上对比分布了。
问题根源
你用的scim.histogram返回的是每个区间的像素频数(即该区间有多少个像素)。100x100的图像总像素是10000,25x25是625,直接把小图像的频数乘16,相当于强行把它的频数拉到大图像的总像素量级,但小样本的随机分布波动本身就比大样本大,所以两条线差异会很明显——这不是缩放的问题,是样本量导致的自然波动,而我们需要的是对比它们的分布形状,不是绝对频数。
解决方案:归一化到频率或概率密度
方案1:归一化到频率(每个区间的像素占比)
把每个区间的频数除以图像的总像素数,得到该区间像素占总像素的比例。这样不管图像尺寸多大,所有直方图的y轴都是0到1之间的比例,直接对比分布形状。
方案2:归一化到概率密度(直方图面积为1)
如果想更严谨地对比概率分布,可以把频率再除以每个区间的宽度,这样整个直方图下方的总面积为1,完全聚焦于分布的形状特征。
修改后的代码示例
import scipy.ndimage as scim import numpy as np import matplotlib.pyplot as plt fig = plt.figure(figsize=(12, 8)) ax = fig.add_subplot(1, 1, 1) # 只用一个子图对比,更清晰 # 处理100x100的图像 band_large = np.random.uniform(0, 1, size=(100, 100, 1)) total_pixels_large = band_large.size x_large = np.linspace(band_large.min(), band_large.max(), 50) y_large = scim.histogram(band_large, band_large.min(), band_large.max(), 50) # 计算频率 y_large_freq = y_large / total_pixels_large # 计算概率密度 bin_width = (band_large.max() - band_large.min()) / 50 y_large_density = y_large_freq / bin_width # 处理25x25的图像 band_small = np.random.uniform(0, 1, size=(25, 25, 1)) total_pixels_small = band_small.size x_small = np.linspace(band_small.min(), band_small.max(), 50) y_small = scim.histogram(band_small, band_small.min(), band_small.max(), 50) # 计算频率 y_small_freq = y_small / total_pixels_small # 计算概率密度 y_small_density = (y_small / total_pixels_small) / bin_width # 绘制频率直方图(推荐用来对比) ax.plot(x_large, y_large_freq, label='100x100 (频率)', linewidth=2) ax.plot(x_small, y_small_freq, label='25x25 (频率)', linestyle='--', linewidth=2) # 如果你想看概率密度,注释掉上面两行,打开下面两行 # ax.plot(x_large, y_large_density, label='100x100 (概率密度)', linewidth=2) # ax.plot(x_small, y_small_density, label='25x25 (概率密度)', linestyle='--', linewidth=2) ax.set_xlabel('像素值') ax.set_ylabel('频率/概率密度') ax.legend() plt.title('不同尺寸图像的归一化直方图对比') plt.show()
效果说明
- 用频率归一化后,两条线会更贴近,因为它们展示的是「每个像素值区间的像素占比」,不管图像大小,这个比例的分布是可比的。小样本依然会有波动,但这是随机数据的正常现象,你可以尝试生成更多样本(比如把小图像的随机数据重复几次,或者用更大的小图像)来减少波动。
- 概率密度则更适合从统计分布的角度分析,尤其是当你想和理论分布(比如均匀分布)对比时,面积为1的特性会更直观。
内容的提问来源于stack exchange,提问作者Paul Bonnard




