直方图均衡化(HE):
“ 如果一副图像的像素占有很多的灰度级而且分布均匀,那么这样的图像往往有高对比度和多变的灰度色调。直方图均衡化就是一种能仅靠输入图像直方图信息自动达到这种效果的变换函数。它的基本思想是对图像中像素个数多的灰度级进行展宽,而对图像中像素个数少的灰度进行压缩,从而扩展像元取值的动态范围,提高了对比度和灰度色调的变化,使图像更加清晰。 ”【来源】
如上图,左图为原图像和其对应的直方图分布,右图为经过直方图均衡化之后的结果图像和其对应的直方图分布;由于左图的直方图集中分布在100-200的区域,图像对比度较低,所利用的灰度级较少,整体图像比较模糊。直方图均衡化的目标就是对图像进行非线性拉伸,增强像素灰度值的动态范围,从而达到增强对比度的目的,使图像可以更细致的利用整个灰度级区间。
推导过程:
首先我们将原图像的像素值缩放到0-1的范围得到:f(x),对其直方图标准化以得到原图像的PDF(概率分布函数):P(f),为了更好的进行推导,我们不妨假设这个f(x)是连续可导的。我们的目标是求出一个T变换(可差分、单调递增、可逆),使得目标图像g(x)满足:
目标图像g(x)的概率分布P(g)满足均匀分布:
根据《概率论与数理统计第四版》(盛骤等)第二章第五节随机变量的函数的分布[定理]:
可以得出(H是T的反函数):
为了使
则:
则:
综上所述,T(f)为f(x)的累计分布函数。
由于真实中,图像的f(x)函数为离散的,对于离散的像素值: f0, f1, f2, f3, f4....f255 ( 0 <= f(i) <= 1 )对应的概率为:
其中ni为fi对应像素的个数
由于g(x)为f(x)的累计概率分布函数,则:
最终的结果g(x)缩放255倍再取整得到真实的变换后的像素值。
【注】老师课上讲的一个比较好的可以用来理解直方图均衡化原理的题:
对比度限制的直方图均衡化(CLHE):
当源图像在某一个像素值(假设0)的概率过大时,直方图均衡化(HE)的变换函数(CDF)就会出现一个飞跃,即在某一点的斜率非常高,那么该像素值被映射到的像素值就会非常大。假设该像素值0经过直方图均衡化变换到像素值200,由于变换函数是递增的,该像素值之后的所有像素值只能在201-255的范围内进行展开。将导致最终没有很好的利用整个灰度范围,而是整个直方图右移了,如下图:
为了解决上述问题,我们采用对比度限制的直方图均衡化,即通过设置一个阙值,调整图像直方图,保证在直方图均衡化之前任意像素值的概率不得超过这个阙值,因此也就不会有一个明显的飞跃导致后面像素值变化范围的缩小了。在实验中可以根据图像的具体情况调整这个阙值。调整图像直方图的方法如下:
即直方图中大于阙值的部分裁剪掉,均匀的分给其他部分,这个重分布的过程可能导致那些被裁减的部分又重新超过了阙值,如果这不是所希望的,可以采用不断重复这一过程直到超出的部分已经微不足道了。
增加对比度限制后,最终实验效果如下:
自适应直方图均衡化(AHE):
虽然全局的直方图均衡化很有效,但是对于一些图像来说,我们可能像对一些局部进行调整,不同区域采用不同的均衡化方法,图像局部细节对比度能得到充分的增强,而且通过差值可以实现图像的平滑过渡。
如果只是单纯的对图像按块进行划分,分别进行直方图均衡化,块与块中间会出现明显的亮度不连续问题。为了消除这种现象,我们采用线性插值的办法,即在在下图中,蓝色阴影的像素部分采用双线性插值;绿色阴影部分采用线性插值;粉色阴影部分采用正常直方图均衡化之后的像素值。
即对于图中00,01,10,11区域内的点(假设该区域长宽均为W;f(00), f(01), f(10), f(11)分别为四个点所在块的变换函数),该点的变换后的像素值为:
绿色阴影部分的线性插值只要令以下条件成立即可:
代码实现(HE, CLHE , AHE):
我的GitHub
参考资料:
【1】限制对比度自适应直方图均衡化算法原理、实现及效果
【2】对比度受限的自适应直方图均衡化(CLAHE)
【3】百度百科-直方图均衡化