Skip to content

直方图均衡化

本教程中你将学到:

  • 什么是图像直方图,以及它为什么有用
  • 使用 OpenCV 函数 cv::equalizeHist 对图像进行直方图均衡化
  • 它是图像强度分布的一种图形化表示。
  • 它量化了每种所考虑强度值对应的像素数量。

Histogram_Equalization_Theory_0.jpg

  • 它是一种提升图像对比度的方法,用以拉伸强度范围(另见对应的 Wikipedia 词条)。
  • 为了说得更清楚,从上面的图像可以看到,像素似乎聚集在可用强度范围的中部。直方图均衡化所做的就是把这个范围拉伸开。看下图:绿色圆圈指示了人口稀少(underpopulated)的强度。应用均衡化后,我们得到中间那幅图所示的直方图。所得图像如右侧图所示。

Histogram_Equalization_Theory_1.jpg

  • 均衡化意味着把一种分布(给定的直方图)映射到另一种分布(更宽、更均匀的强度值分布),从而使强度值铺满整个范围。

  • 为实现均衡化效果,这种重映射应当是累积分布函数(cdf)(更多细节请参阅 Learning OpenCV)。对于直方图 H(i)H(i),其累积分布 H′(i)H^{'}(i) 为:

    H′(i)=∑0≤j<iH(j)H^{'}(i) = \sum_{0 \le j < i} H(j)

    要把它用作重映射函数,我们必须对 H′(i)H^{'}(i) 进行归一化,使其最大值为 255(或图像强度的最大值)。由上面的例子,累积函数为:

  • 最后,我们用一个简单的重映射过程来获得均衡化后图像的强度值:

    equalized(x,y)=H′(src(x,y))equalized( x, y ) = H^{'}( src(x,y) )

Histogram_Equalization_Theory_2.jpg

  • 这个程序做什么?

    • 载入一幅图像
    • 将原图转换为灰度图
    • 使用 OpenCV 函数 cv::equalizeHist 对直方图进行均衡化
    • 在一个窗口中显示源图像与均衡化后的图像。
  • 可下载代码:点击 这里

  • 代码一览: 代码见下方示例

  • 可下载代码:点击 这里

  • 代码一览: 代码见下方示例

  • 可下载代码:点击 这里

  • 代码一览: 代码见下方示例

  • 载入源图像:

  • 将其转换为灰度图:

  • 用函数 cv::equalizeHist 应用直方图均衡化:

    容易看出,其参数只有原图与输出(均衡化后)图像。

  • 显示两幅图像(原图与均衡化后的图像):

  • 等待用户退出程序

  1. 为了更好地体会均衡化的效果,我们引入一幅对比度不高的图像,例如:

    顺带一提,它的直方图如下:

    注意像素聚集在直方图的中心附近。

  2. 用我们的程序应用均衡化后,得到如下结果:

    这幅图像的对比度明显更高。来看看它的新直方图:

    注意像素数量是如何更均匀地分布在强度范围之内的。

注意: 你在想我们是如何绘制出上面那些直方图图的吗?请继续阅读下一个教程!

Histogram_Equalization_Original_Image.jpg Histogram_Equalization_Original_Histogram.jpg Histogram_Equalization_Equalized_Image.jpg Histogram_Equalization_Equalized_Histogram.jpg