在好久前实现对比度受限的自适应直方图均衡化时,就曾经想过对该算法进行必定程度的扩展,以后使用自动对比度和自动色阶代替直方图均衡化也提出了新的算法,也达到了不错的效果。本文进一步对该算法进行必定程度的扩展和补充优化。算法
1、本文算法的概述测试
根据选取的优化的水平和垂直网格数,将图像切分红一个一个的子块,而后统计每一个子块的直方图信息,并和原图总体的直方图信息进行某种混合,对于彩色图像,为了不不一样通道之间处理后变化过于不协调,还增长了各通道直方图与亮度通道直方图的信息合成,而后对合成后的直方图进行直方图裁剪和均衡化的,获取各子块新的映射直方图,为了不新的映射表中的数据有较大的奇点或噪音,对映射表的数据进行多点取样,而后使用样条插值算法对取样点进行插值,或者对新的映射表进行必定程度的高斯模糊,获得一张较为平滑的映射表。最后使用相似CLAHE算法中的双线性插值对每一个子块之间的映射表进行插值获得新的像素值。本方法计算量小,速度很快,对映射表进行平滑插值或高斯模糊能有效的抑制对比度调整时产生的噪声,防止了信息的过分放大形成图片失真,是一种高效而且效果突出的对比度加强算法。优化
2、算法过程详解spa
一、水平和垂直网格数的肯定3d
相似于CALHE算法,对网格的合理选取也会对本算法的结果产生重要的影响,过多的网格数会使得计算量显著加大,过少的网格数使得结果趋于接近总体的直方图均衡化,通常状况下,可选择8*8个网格,这里能够经过如下原则来简单的作个优化:图像的亮度的均方差越小,即整幅图像的明暗比较一致,使用较多的网格数,好比8*8,不然使用较少的网格,好比4*4。这是由于当图像明暗较为一致时,各小块的直方图数据差别不会很大,而若是明暗不一致,选择较小的块,各块之间的直方图信息差别可能很大,会形成插值时出现明显的瑕疵。code
二、按规定的网格数划分图像,并获取每块的直方图信息HistB,HistG,HistR。blog
三、获取全图的直方图数据HistgramB,HistgramG,HistgramR以及亮度直方图HistgramL。索引
其中亮度定义为: Lightness = (R*19595 + G*38469 + B*7472) >> 16图片
四、对子块直方图和全局直方图进行融合,以下代码所示:ip
HistB[Index] = (HistB[Index] * Adaptation + (100 - Adaptation) * HistgramB[Index]) / 100; HistG[Index] = (HistG[Index] * Adaptation + (100 - Adaptation) * HistgramG[Index]) / 100; HistR[Index] = (HistR[Index] * Adaptation + (100 - Adaptation) * HistgramR[Index]) / 100; HistL[Index] = (HistL[Index] * Adaptation + (100 - Adaptation) * HistgramL[Index]) / 100;
其中Adaptation为融合因子,其有效范围为[0,100],当取值越小时,全局直方图其主导做用,效果越接近普通的直方图均衡。
五、对上述融合后的结果再次和亮度直方图进行融合,融合过程以下所示:
HistB[Index] = (HistB[Index] * Correction + (100 - Correction) * HistL[Index]) / 100; HistG[Index] = (HistG[Index] * Correction + (100 - Correction) * HistL[Index]) / 100; HistR[Index] = (HistR[Index] * Correction + (100 - Correction) * HistL[Index]) / 100;
其中Correction为颜色校订因子,其有效范围为[0,100],当取值越大时,各通道之间越独立,效果越接近普通的直方图均衡。
上述代码中Index表示直方图色阶的索引范围,有效值[0,Bins – 1],Bins为直方图的数量,8位时为256。
六、按照CALHE的方式对直方图进行裁剪,以后对裁剪的直方图进行均衡化获得每一个小块的映射表。
七、局部均衡化后映射表的平滑。
1) 将映射表的 Bins取K等份,获得每等份数据对应的映射表值,构成K个二维坐标点序列,亦能够根据直方图的累计数据,把累计数据平均分为K等分,获得K个二维序列点。
2)根据K个二维坐标点,使用样条插值算法拟合出一条过各个取样点的平滑映射曲线。
3)在平滑曲线表中取0至于Bins中各色阶对应的插值结果,做为新的映射表结果。
对于Bins =256的图像,K值建议可取32左右。
或者另一种处理方式就是对映射表进行一维方向的均值或者高斯平滑,平滑窗口可选WindowSize = 7左右。
这种平滑能够带来必定的好处,特别是对于图像变换比较平缓的区域,可以在必定程度上减弱因为加强带来的色块感受,并且这种方式推广到全部基于直方图加强技术的算法中。
八、按照CLAHE算法的过程对每一个小块进行双线性插值获得最终的加强效果,固然对第一行、第一列、最后一行、最后一列的子块靠近图像边缘的那一半都只使用映射表单个方向的线性插值,而这些子块的其余部分以及其余子块均使用映射表双线性插值得到最终结果。
若是输入图像是灰度图,因为只有一个通道,则本算法中的Correction在此场景中是可舍弃的。
整个过程的流程框图以下所示:
3、测试结果
下图为未通过处理的原始图像,可见原始图中对比度不好,图像的细节信息不多,图像饱和度也不好。右侧是使用本算法后处理的效果图,处理后图像饱和度天然,色彩鲜艳,隐藏在原图右侧的一些不可易见的细节也能清楚的展现出。
原始图像 Adaptation = 50,Correction = 50, ClipLimit = 20时的效果
Adaptation = 0,Correction = 50, ClipLimit = 20时的效果 Adaptation = 100,Correction = 50, ClipLimit = 20时的效果
Adaptation = 50,Correction = 0, ClipLimit = 20时的效果 Adaptation = 50,Correction = 100, ClipLimit = 20时的效果
下面做图是另一副未经处理的图像,这副图像信息较为完整,色彩也较为丰富,可是通过本算法处理后,获得的结果图(右图)则显得更为惊艳和夺目,所以对于正常的图像,本算法也具备较强的实用性。
特别强调,该算法不适宜处理人脸图像。
该算法难以使用SSE优化,我在考虑是否还有其余方式优化。速度上1080P的彩图大约30ms能够搞定。
测试工程的地址:http://files.cnblogs.com/files/Imageshop/SSE_Optimization_Demo.rar
写博不易,欢迎点赞或者打赏。