计算机

直方图算法

直方图

概念

在图像领域,直方图(histogram)指的是像素各个取值(通常为 0~255)的频数表或频数图。

这个直方图可以理解为统计学上组距为 1 的直方图,也可以理解为算法中 (链接未公开) 的概念。

同时,直方图的纵坐标视情况可以取计数或者频率,当直方图的纵坐标取频率时,还可以视为概率论中离散随机变量的概率质量函数或者分布列。

直方图的计算和显示

由于图像直方图可以看做是权值数组,使用 np.bincount 就可以得到图像的直方图(列表形式),返回一个长度为 256 的 NumPy 数组:

img = cv2.imread("path/to/image.jpg", cv2.IMREAD_GRAYSCALE) // 读取黑白图片
hist = np.bincount(img, minlength=256) // 计数,得到直方图

当需要以统计图的形式直观地展现直方图时,可以使用 plt.bar 方法来绘制条形图(参考:(链接未公开))。为了绘制出接近于图像直方图的条形图,可以设置如下参数:

  • width=1:条的宽度,设置为 1 可以使两个条形直接无间隙;
  • align='edge':条默认是中心对齐横坐标,这里改用 edge,让条的左边缘对齐横坐标。 同时,还可以通过 set_xticks 改变横坐标刻度位置,通过 set_xlim 控制横坐标的范围,实现更精确的直方图绘制:
fig, ax = plt.subplots(figsize=(10, 6))
ax.bar(np.arange(256), hist, width=1, edgecolor='none', align='edge')
ax.set_title('Histogram')
ax.set_xlabel('Pixel Value')
ax.set_xlim(0, 256)
ax.set_xticks([0, 64, 128, 192, 256])
fig.savefig("path/to/save/histogram.png")

绘制后的图像直方图如图所示:

直方图平衡

概率论背景:若 X 的分布函数是 F(x),则 F(X) 服从 [0, 1] 上的均匀分布。

BEYOND THE ARTICLE

读完了,有什么想法?

阅读已保存的问答示例,并循着引用回到原文。

查看公开问答示例
— 本文完 — 返回文章列表