董辉 张斌
光在空气中传播时会被“雾”[1−2]反射、吸收和散射.光的强度和颜色会因雾的浓度和光线传播距离发生改变.这就造成了图像质量下降,包括图像模糊,对比度下降,色彩弱化,场景特征减弱.特别是有雾图像的深度信息被破坏,会影响后续图像处理和视觉计算效果.所以,在遥感、航空和水下图像处理,室外监控和目标识别应用中,去雾处理被广泛使用.图像去雾可以消除雾气干扰和颜色失真,提高对比度和视觉效果.
去雾技术中主要的挑战是有雾图像丢失了原始场景的深度信息,这样就不能使用大气散射模型对图像建模.所以,在去雾处理时,需要使用多幅图像或附加信息获得场景的深度信息,实现对有雾图像建模.当前,主要的去雾方法有三类.第一类采用图像处理方法.包括直方图均衡[3−4]和Retinex方法[5].基于图像处理的去雾方法只关注图像对比度,饱和度和亮度的提高.这类方法不能得到场景的深度信息、而且会恶化图像的视觉效果.第二类采用物理模型方法.这类方法使用附加信息、多幅图像或先验.使用附加信息的方法包括使用大气光偏振效应[6]和深度信息[7].这两种附加信息需要使用额外的器件,因而在实际应用中不能方便获得.使用多幅图像的方法通过采集同一场景不同天气条件下的多幅图像实现[8−10].在实际应用时,多幅图像并不能很轻易的获取.所以,基于假设[11−13]或先验[2,14]的方法得到越来越多的应用.这种方法首先对雾建模,然后通过逆过程实现去雾.这种方法使用单一有雾图像实现去雾,效果自然.第三类方法基于机器学习[15−18],针对特定大气条件训练模型.这类方法有较好的去雾效果,但是对非雾气造成的图像退化产生不好的影响.当前,去雾方法中最简单有效的是基于暗通道先验(Dark channel prior,DCP)的方法[2].但这一方法并不能很好地处理天空图像和光晕现象,而且计算量大.针对该方法的不足,一些后续工作对其进行了补充[19−21].
本文在DCP方法的基础上引入可变形自适应滤波和形态学重构,实现去除光晕现象.采用最优化介质传播系数[22]处理有雾图像天空区域.实验结果表明本文提出的算法能够普遍用于不同雾气条件的图像去雾.对天空区域和光晕的去除都有很好的处理效果.而且,该方法采用形态学运算,易于并行化和硬件实现.
在计算机视觉中,大气光散射模型为:
其中,E为辐照度,d为光线传播的距离,λ为光的波长,E0(λ)为光源的照度(d=0),β(λ)为总散射系数,E∞(λ)为大气光的最大辐照.公式右边的第一项为入射光线的衰减模型,第二项为大气光模型.有雾图像模型[2,14]可以简化为:
其中,I(x)为观测图像,J(x)为场景辐照,A为全局大气光,t(t(x)=e−βd(x))为透射率.图1说明式(2)各项在图像中的意义.图像去雾的目的就是使用下式恢复出场景J:
图1 有雾图像模型Fig.1 Haze imaging model
去雾中的挑战是从单幅图像I中估算出A和t.显然未知条件大于约束.J不可能直接由式(3)算出.因此,需要使用先验或假设提供更多约束.
图像去雾本质上是一个病态问题,所以需要经验观测值,多种假设或先验知识才能实现.Zhu等[11]发现了颜色衰减先验.Meng等[23]针对大气透射函数提出了内在边界约束.不同于其他方法基于有雾图像提出假设或先验,He等[2]基于无雾图像的统计特性提出了DCP.DCP基于无雾图像的一个基本特征:无雾图像中除天空区域,至少有一个颜色通道的亮度非常低.DCP提出三条先验:大气光值已知,大气透射率在图像块中是常数,J的暗通道亮度趋近于0.任意图像P的暗通道计算为:minΩDC(x)(minCPC).其中,PC为P的彩色通道,ΩDC(x)为中心点x的邻域.minC∈(R,G,B)计算每个像素的最小颜色通道值,minΩDC(x)计算x邻域ΩDC(x)中的最小值.暗通道的计算过程如图2所示.
图2 暗通道计算Fig.2 Calculation of dark channel
大气光值A假设为已知值,式(2)归一化为:
其中,C表示R、G、B三个颜色通道.像素x的邻域ΩDC(x)中常量透射系数t表示为(x).式(4)等号两边进行最小值运算得到:基于无雾图像的非天空区域暗通道值趋近于零这一先验,以及大气光值非负,式(5)简化为:
然后图像场景J(x)可以通过下式计算得到:
这样,有雾图像就实现了去雾处理.使用这一方法恢复出的图像效果好,计算简单.但是,在去雾过程中,假设图像在每一个像素邻域中透射率相同.这样恢复出的图像在某一图像块中深度不连续的位置会产生光晕现象.为解决这一问题可以使用导向滤波(Guided image filter,GIF)[20].
通常情况下,基于DCP的去雾方法能够有效地对单幅有雾图像去雾.但是,仍存光晕现象和天空区域彩色失真现象.
1.3.1 光晕现象
像素邻域大小的选择在DCP方法中非常关键.在去雾运算中,邻域越小Jdark(x)的计算结果误差越大,恢复的场景图像过饱和越明显.但是,大的邻域会使得透射率在一个过大的区域内都保持恒定,在邻域内存在深度边缘时,会产生强的光晕现象,如图3所示,邻域越大,去雾后的图像光晕影响越大.因此,GIF、散射模型[24−25]、混合DCP[26],保边处理[12,27]和视觉恢复[28]等技术被用于解决光晕问题.但是这些技术都有其自身的限制.散射模型方法需要预先得到Trimap图或用户手动标记前景背景.其他方法需要大量的计算和存储资源.而且,上述方法都是使用固定尺寸的图像块对一幅图像进行处理.使用形状不变的邻域会破坏图像块中深度突变位置的深度信息,造成透射率计算的错误.比如使用GIF,大尺寸窗口能够分散深度边缘周围的光晕.但是,去雾后图像深度边缘模糊,如图4所示,窗口越大,光晕越弱,但是叶子和树枝边缘的对比度越差.
本文采用自适应结构元和形态学重构计算透射率,为了实现不同深度的保边滤波,实现在深度近似的结构中完成滤波和细小纹理消除,同时保持图像的深度边缘.同时,因为形态学运算的天然并行性,易于并行加速和硬件实现.首先使用有雾图像对每一像素点计算其合适的结构元,然后使用这些结构元完成中值滤波输出模板图像.有雾图像的暗通道图像作为标记图像.使用标记图像和模板图像完成形态学膨胀重建运算,结果即为精细化的暗通道图像.
1.3.2 颜色失真
DCP中,不同区域使用同一恒定的大气光值并不适合,特别是在天空区域,会产生严重的色彩失真.当图像中像素I大于选定的A时,J(X)=1/t(I−A)+A会得到大于255的数值,这样就产生了结果的上溢,造成恢复图像的颜色失真.文献[2]中,假设大气光值大于所有目标亮度.但是,当目标亮度大于AC时,式(7)会计算出错误的透射率(x),如图5所示.为了减少天空区域的色彩失真,文献[29]引入启发式边界,假设地面区域的透射率只与其距地平线的垂直距离有关,超过地平线的天空区域透射率置为0.这一方法对于非天空区域会产生发黄和偏暗的效果.文献[30]根据有雾图像的统计直方图自动检测雾气程度,然后引入非负天空区域补偿项,用于调整天空区域(x)的初始值.但是这一方法会产生明显的块效应.
图3 不同邻域大小对去雾的影响Fig.3 Haze removal results by different patch sizes
本文将文献[22]中提出的损失函数用于整幅图像的透射率计算.该损失函数包括两部分:对比度项和信息损失项.通过损失函数的约束,避免了有雾图像中亮度大于大气光值的像素,在去雾处理时发生溢出.本文提出计算亮通道(R、G、B三通道中的最大值),使用亮通道计算透射率.然后融合由亮通道和重构图分别计算的透射率,得到最终的透射率(x).这样能够有效避免天空区域的色彩失真.
图4 DCP+GIF方法使用不同大小邻域的去雾效果Fig.4 Haze removal results by DCP+GIF with different patch sizes
图5 使用DCP去雾后天空区域的颜色失真现象Fig.5 Haze removal results with large sky region
图6 本文去雾算法流程Fig.6 Flowchart of our proposed algorithm
本文提出的算法流程如图6所示.包括自适应滤波,形态学重构和天空区域处理:
1)由有雾图像I的灰度图计算显著图(Salience map,SM)[31].SM作为导向图计算自适应结构元.生成的结构元对最小颜色通道图像dc1进行中值滤波.得到保留了边缘,抑制了细节的结构图像AF.
2)由I计算最小颜色通道dc1和暗通道dc2.根据dc2和I计算大气光值A.以dc2为标记图像,AF为模板图像完成形态学膨胀重构运算,获得精细化暗通道图像dc3.结合A计算暗通道透射率tdc.
3)由I计算最大亮通道bc.根据bc计算亮通道透射率tbc.逐像素比较tdc和tbc,输出最大值得到最优透射率(x).最后,由(x),A和I恢复出去雾图像.
去雾处理的中间过程如图7所示.自适应滤波图、暗通道图和亮通道图由I计算得到.暗通道和自适应滤波图完成重构运算.使用重构图像计算tdc.亮通道进行一次膨胀运算再计算tbc.融合两种透射率后使用式(8)实现去雾.
透射率t的表达式为:
其中,β表示散射系数,d(x)表示场景深度.t仅与场景深度有关.令f和g分别表示标记图像和模板图像,并且f≤g,测地膨胀定义为:
其中,b为结构元(Structure element,SE),⊕表示膨胀运算,∧表示按像素对应取最小值.大小为n的测地膨胀定义为:
标记图像f对模板图像g的膨胀形态学重建表示为:
其中,k为迭代次数.当迭代运算达到稳定,即时,迭代停止.膨胀重建能够在不改变物体形状的前提下消除标记图像中的细小结构.将形态学重建引入透射率的优化计算,需要选择合适的标记和模板图像.AF(Igray)和dc2分别作为模板和标记图像进行形态学重构运算,结果如图8所示.与采用GIF的方法比较,采用形态学重构恢复的有雾图像具有更好的对比度和纹理结构.但是采用形态学重构恢复图像,在同一场景深度,很难去除细纹理集中区域的细纹理.因此,要提高去雾的效果,需要解决的问题是:保证深度边缘不被模糊,抑制相近场景深度的密集细纹理.为此,我们引入了可变形自适应滤波.
图7 本文去雾算法中间过程Fig.7 Flowchart of proposed haze removal procedure
最小颜色通道既有图像的强边缘信息,也有细纹理和噪声.最优的模板图像应该仅包含完整且定位准确的深度边缘信息.形态学运算中,通常使用开启和闭合运算去除图像细边缘和噪声.但是会模糊图像边缘.所以,采用自适应可变形中值滤波对模板图像进行预处理,能够很好地去除噪声和细纹理,同时保持准确的深度边缘,如图9所示.
我们采用显著图[31]作为导向图(Pilot)计算可变结构元.SM计算过程如算法1所示.计算出导向图后,使用算法2,实现对每个像素的自适应中值滤波.去雾效果如图10所示,去雾后的图像避免了光晕效应,而且对比度得到了增强.
图9 自适应滤波结果Fig.9 Adaptive filtering results
图10 使用自适应中值滤波和形态学重构实现的去雾结果Fig.10 ADSE filter and morphological reconstruction results
算法1.显著图(SM)计算
输入.灰度图像I(x).
输出.显著图.
步骤 1.计算I(x)的二维离散傅立叶变换:F[I(x)].
步骤2.计算频谱幅值A,相位谱P和log谱L:A=(F[I(x)]),P=φ(F[I(x)]),L=lg(A).
步骤3.V=hn⊗L,其中hn为均值滤波模板.
步骤4.计算谱残差:R=L−V.
步骤 5.计算SM:SM(x)=g(x)⊗F−1[exp(R+P)]2,g(x)为高斯滤波模板.
算法2.自适应中值滤波
输入.导向图SM,dc1,结构元限制范围Ω(边长为2r+1的矩形).
输出.自适应中值滤波后的图像.
步骤1.j=1,循环步骤2∼5.
步骤2.以当前像素为中心,选取区域Ω,Ω中每一像素i计算沿不同路径到中心点的像素值距离,Ω内结构元长度d(x,y)的均值T作为结构元长度上限.
步骤3.比较Ω内各像素点结构元长度d(x,y)与T,若d(x,y)>T,自适应SE当前位置置0;否则,置1.
步骤4.使用当前得到的自适应SE对dc1进行中值滤波,结果为输出图像当前像素的灰度.
步骤 5.j⇐j+1,移动到下一像素,直到(j=N),结束循环,其中,N为图像像素个数.