直方图均衡化(HE)
直方图均衡化是最简单、最方便的低亮度图片增强的算法。
HE通过拉伸图片直方图的分布,使得图片的直方图均匀的分布在[0,255] (8bit图像),从而增强图片的全局对比度。
适用范围
对图像前景和背景都非常暗(或非常亮)的图片很有用。
缺点
- 容易增加背景噪声的对比度,并且降低有用信号的对比度。
- 容易造成局部图片过饱和。
保持亮度的动态直方图均衡化(Brightness Preserving Dynamic Histogram Equalization:BPDHE)
在增强图片对比度的时候,需要保持增强后的图片与增强前的图片在亮度上是相同的
适用高斯滤波器平滑直方图
由于数字图像的直方图并不是平滑的,会出现比较大的波动,以及会在某些数字上有所缺失,所以在直方图进行下一步处理前,需要先对直方图进行一个预处理。
- 使用线性插值方法补齐直方图上的缺损数值。
- 使用一维高斯滤波器对直方图进行滤波。
其中是相对于kernel中心位置的坐标,是标准差。
文章中使用的kernal大小为,的大小为1.0762。
检测平滑后直方图局部最小值的位置
- 计算直方图的一阶导数。
- 由于直方图的一阶导数依然可能出现一些不平滑的现象,为此在寻找最小值之前,需要在进行一步预处理。
change +-+ to +++
change -+- to ---
- 寻找局部的最小值
the local maximums are detected as the points where four successive negative signs are followed by eight successive positive sign
将每局部最小值之间的每一部分映射到一个新的动态范围内
假设对应于上述个局部最大值的灰度值。
则这个局部最大值可以将图像的直方图分割为:
现在我们将这些子直方图的范围映射到新的动态范围,映射的方法如下:
其中 是每个子直方图中最高的像素值,是每个子直方图中最低的像素值,M是该子直方图中所有像素的数目。
对于映射后的子直方图的范围,可由下式计算得到:
均衡化每个子直方图
对于每一个子直方图,我们使用以下公式得到每个像素值对应的输出
其中对应于像素值
为的像素数量,为该子直方图所包含的像素总量。
归一化图像的亮度
- 计算均衡化之前和之后图像的平均亮度和。
- 用下的公式对均衡后的图像进行归一化:
其中是最终的输出图像,是均衡化后的图像。
这一步做的目的是保持增强前的输入图片与输出图片有着相同的亮度。
实现代码
- he
Matlab中histeq函数。 - bpdhe
https://github.com/baidut/OpenCE/tree/master/others
效果比较
从以上的效果图可以看出,he非常容易使得图片过饱和,对于彩色图片来说,色彩也非常容易发生改变。
bpdhe由于保持了与原图整体的亮度,虽然对比度相对原图有所增强,但并不适合用于低亮度图片的增强。
参考文献
https://zh.wikipedia.org/wiki/直方图均衡化
https://ieeexplore.ieee.org/document/4429280