直方图均衡化
本教程中你将学到:
- 什么是图像直方图,以及它为什么有用
- 使用 OpenCV 函数 cv::equalizeHist 对图像进行直方图均衡化
什么是图像直方图?
Section titled “什么是图像直方图?”- 它是图像强度分布的一种图形化表示。
- 它量化了每种所考虑强度值对应的像素数量。
什么是直方图均衡化?
Section titled “什么是直方图均衡化?”
- 它是一种提升图像对比度的方法,用以拉伸强度范围(另见对应的 Wikipedia 词条)。
- 为了说得更清楚,从上面的图像可以看到,像素似乎聚集在可用强度范围的中部。直方图均衡化所做的就是把这个范围拉伸开。看下图:绿色圆圈指示了人口稀少(underpopulated)的强度。应用均衡化后,我们得到中间那幅图所示的直方图。所得图像如右侧图所示。
它是如何工作的?
Section titled “它是如何工作的?”
-
均衡化意味着把一种分布(给定的直方图)映射到另一种分布(更宽、更均匀的强度值分布),从而使强度值铺满整个范围。
-
为实现均衡化效果,这种重映射应当是累积分布函数(cdf)(更多细节请参阅 Learning OpenCV)。对于直方图 ,其累积分布 为:
要把它用作重映射函数,我们必须对 进行归一化,使其最大值为 255(或图像强度的最大值)。由上面的例子,累积函数为:
-
最后,我们用一个简单的重映射过程来获得均衡化后图像的强度值:

-
这个程序做什么?
- 载入一幅图像
- 将原图转换为灰度图
- 使用 OpenCV 函数 cv::equalizeHist 对直方图进行均衡化
- 在一个窗口中显示源图像与均衡化后的图像。
-
可下载代码:点击 这里
-
代码一览: 代码见下方示例
-
可下载代码:点击 这里
-
代码一览: 代码见下方示例
-
可下载代码:点击 这里
-
代码一览: 代码见下方示例
-
载入源图像:
-
将其转换为灰度图:
-
用函数 cv::equalizeHist 应用直方图均衡化:
容易看出,其参数只有原图与输出(均衡化后)图像。
-
显示两幅图像(原图与均衡化后的图像):
-
等待用户退出程序
-
为了更好地体会均衡化的效果,我们引入一幅对比度不高的图像,例如:
顺带一提,它的直方图如下:
注意像素聚集在直方图的中心附近。
-
用我们的程序应用均衡化后,得到如下结果:
这幅图像的对比度明显更高。来看看它的新直方图:
注意像素数量是如何更均匀地分布在强度范围之内的。
注意: 你在想我们是如何绘制出上面那些直方图图的吗?请继续阅读下一个教程!
