《Gray-Level Groupinig(GLG):An Automatic Method for Optimized Image Contrast Enhancement--Part Ⅰ:The Basic Method》阅读心得及Python实现源代码,包括基本GLG算法、FGLG、AGLG。
本文提出了一个应用在灰度图上的图像对比度增强算法,能够在不需要人工改变算法参数的情况下自动增强图像的对比度,提高显示效果。算法操作的对象集中在灰度直方图上,对比度较低的图像的直方图灰度大多集中在某一区域,算法的目标就是让灰度级更合理的分布在直方图上。振幅小的灰度级应当距离相对较近,振幅大的灰度级则应当相距较远。
对于一幅灰度图像,首先得到它的统计直方图H(k),把强度值非0的灰度级作为初始的组G(i),初始化L(i)和R(i),分别作为每个组灰度级大小的左边界和右边界。
对于每一次循环:
(1)找到所有组中最小的强度值,记录其下标,在该组左右两边寻找较小的组与其组成一个新的组,更新G(i)、L(i)、R(i)。
(2)计算灰度级转换表。计算组间间距N,首先将两端的灰度级拉伸到该灰度级的端点,然后按照组间间距N,组内间距在N内均匀分布的原则,计算所有灰度级的转换表T(k)。
(3)将转换函数应用到原始图像上,得到新的直方图,计算像素间的平均距离D。
循环直到组数为2。寻找最大的像素平均距离D所对应的转换函数T,并将原始图像转换为最终的对比度增强了的图像。
更改基本GLG算法的循环步骤,不再每次都计算转换表和像素平均距离,循环到指定的组数后停止,直接获得该组的转换函数T并应用到原始图像上,获得对比度增强的图像。
A-GLG算法是建立在基本GLG算法的基础上的。
(1)将原始图像划分为M×N个子图像。
(2)对每个子图像采用GLG算法计算得到子图像的最优转换表T。
(3)把灰度级等于L-1的灰度作为背景色,在忽略背景色的情况下,对每个位置的每个灰度级,计算转换得到的灰度的平均值,得到中间转换表A,以均衡子图像在最终图像中的对比度,不至于显得太突兀。
(4)以双线性插值的方式重建最终的对比度增强的图像。
如图2-1所示为一幅原始的未经处理的低对比度图像,图像大小为800×534像素。图2-3为原始图像经过GLG处理后得到的图像,可以发现原始图像的对比度被明显增强了,说明GLG算法能够真实有效地提高图像的对比度,且取得了不错的效果。
图2-2和图2-4分别为原始图像和经过GLG处理后图像的灰度直方图,原始图像直方图强度值较高的灰度级集中在130到180之间,且0到100之间的灰度级和200以上的灰度级没有被充分利用,经过GLG处理后,直方图的灰度级被拉伸到两端,充分利用了灰度空间,灰度中间过于集中的灰度级变得相对分散,且强度大的灰度级要比强度较小的灰度级之间的距离要大一些,这也是算法提出的要求,最终灰度级依据强度大小更加合理的分布在直方图上。
图2-1 原始低对比度图像
图2-2 原始图像灰度直方图
图2-3 经过GLG处理后的图像
图2-4 GLG处理后图像灰度直方图
图2-5 PixDist随n的变化曲线(n从大到小变化)
图2-5展示了图2-1随着n从大到小一次次地循环,每次分组、映射、取消组后所得到的直方图对应的像素距离的变化。在对图2-1的实验中,n从143开始,随着n的逐渐减小,像素距离逐渐升高,在n=31时达到最大值,此时像素距离为36.0,之后逐渐下降并经历一个小的波峰后继续下降,在n=2时结束。
原始图像的像素距离为8.0,对比图增强后的像素距离为36.0,图像的增强效果很明显,图像大部分细节都展现了出来。
FGLG的基本原理与GLG相同,只是不再需要寻找最优的像素距离,而是根据经验,把最终的组数锁定在一个确定的数字上。这样做就不再需要每一次循环都计算转换表和像素距离,只需要计算最后一次的结果,使每次循环的时间大幅度减少,同时不再需要存储转换表和像素距离,也节省了大量空间。从实验效果来看,这样做是可行的,在不追求完美对比度的情况下,该做法能在保证效果的前提下,极大的减小程序运行的时间和空间。
图像对比度的效果来看,效果非常明显,要好于GLG算法,更多的细节被显示出来。尤其是原图中强度较高的灰度级主要集中在灰度级较小的区域,被GLG算法拉伸后灰度级较小的区域(如图中右上方的河流区域)仍然是低对比度的,无法看清,经过A-GLG算法处理后,每个局部区域的子图像对比度都是最强的,重新组合起来整幅图像的对比度都比较强。当然,这样处理也有一定的代价,即失去了其整体的特征,不同子图像之间像素的大小关系被抛弃了。
从其处理后灰度直方图来看,直方图几乎达到了理想的状态,分布非常均匀,直方图的强度整体被压缩都差不多的大小也意味着失去了其图像整体的像素之间的大小关系。
在计算图像的Tenengrad值时,使用Sobel算子。
经计算,图2-1原始图像的Tenengrad值为7.4e8。
经过GLG处理后的图像Tenengrad值为17.8e8。
经过FGLG处理后的图像Tenengrad值为9.7e8。
经过A-GLG(子图像大小30×30)处理后的图像Tenengrad值为388.0e8。
原始图像经过GLG处理后大幅度提高了图像的Tenengrad值,FGLG小幅提升,均能有效增强图像的对比度。GLG因为选择过最优像素距离,提升效果更加显著,也间接说明了像素距离和Tenengrad值在某种程度上都能很好地表示图像的质量。A-GLG因其牺牲了不同子图像之间像素点的大小关系,提升对比度的效果远大于基本的GLG算法。
GLG算法能够有效的增强图像的对比度,也有着和其他对比度增强算法一样的缺点,就是会放大噪声,在某些噪声较多的图像,GLG算法也许甚至能起到反作用,增大了噪声,尽管直方图达到了理想的效果,但是显示效果不尽如人意,噪声占据了太多空间。
GLG和FGLG的计算复杂度已经由论文第Ⅲ部分给出,而A-GLG的计算复杂度论文并没有提及。A-GLG的性能主要消耗在对每个子图像计算GLG得到转换函数上,该部分的时间复杂度为O(M×N×GLG时间复杂度),计算中间转换函数A消耗的时间复杂度为O(M×N×L),双线性插值消耗的时间为O(w×h×L),其中w和h分别表示原始图像的宽度和高度。通过分析算法的复杂度,可以发现A-GLG算法的时间复杂度是远高于GLG算法的,且与图像的分块数目有很大关系。
论文提出了一种基于灰度直方图的图像对比度增强算法,通过实验验证,该算法确实可以真实有效地增强图像对比度,提高视觉效果。算法的操作对象是灰度直方图,最终目标是让原始低对比度的图像变成对比度较高的图像,展现更多的细节,在直方图上对应的表现是灰度级较均匀的分布在整个灰度空间,没有过于密集的区域,且强度较大的灰度级之间应当相距较远,强度小的灰度级的间距应当被压缩。
通过实验,可以发现论文提出基本GLG算法确实能够自动地增强图像的对比度,效果较好,最终的直方图也与理想中的一样,达到了预期效果。FGLG和A-GLG作为两种改进形式也各有优缺点。FGLG在速度上进一步优化,但是显示结果稍逊于基本的GLG,如果对时间要求比较苛刻可以采用FGLG。A-GLG展现了更多的图像细节,但是算法运行时间也大幅度增加。
论文提出了一个效果卓越的对比度增强算法,但是也存在一些疏漏和小小的失误。通过阅读、实现并实验,整理如下:
(1)论文2296页Fig.7,在求解转换函数的伪代码框中,是不需要对每一个0到M-1之间的灰度值求转换函数的,只需计算强度不为0的灰度级对于的转换函数。强度为0的灰度级表明原图中没有任何一个对应的像素点,因此既没有计算的意义,计算出来的结果也没有意义,因此应当预先判别。
(2)同样位于论文2296页Fig.7,下方L的值的意义在上下文中没有说明,L作为变量在论文第Ⅲ部分才被提到,此处L-1应为M-1,或将L的意义阐明。
(3)这一个不太确定。论文2299页第Ⅲ部分的计算时间复杂度部分,提到GLG算法计算转换函数的复杂度为O(L2)。从实现的角度看,计算转换函数的时间复杂度不应该只有O(L2),在对每一个灰度级k求解转换后的灰度级时,是需要在Ln-1和Rn-1数组中寻找下标的,顺序遍历需要的时间是O(L),二分查找也需要O(log L),因此计算转换函数的时间复杂度应该至少是O(L2log L)。
(4)论文2300页第Ⅳ部分2)的b),对A边界部分的计算。Ti,j的下标i=1,2,…,M,j=1,2,…,N,而该部分求解A用到了TM+1,j-1(k),超出了下标的范围,对j同理。在这里我的处理方法是将T的下标向内移动一个单位,即使用TM,j-1(k),并在最终的图像中抛弃边缘区域。
python实现源代码,如果对你有帮助,麻烦点下star,谢谢啦~