基于三区域划分的单幅图像去雾算法
2020-02-27郭新运孙丕波2刘晓欣
郭新运,孙丕波2,卢 潇,高 尚,刘晓欣,范 迪
(1.山东科技大学 电子信息工程学院,山东 青岛 266590; 2.青岛酒店管理职业技术学院 信息工程技术学院,山东 青岛 266100)
在雾、霾天气条件下,由于大气中水汽、烟尘、微水滴等微粒子的散射、吸收作用,物体表面的反射光在到达成像设备的过程中发生较大的、随机的衰减,致使所拍摄的图像整体模糊、对比度低、色彩退化。雾致退化给后续图像在目标识别[1]、视频监控[2]、遥感航拍[3]等领域的应用带来困难。
目前,图像去雾算法主要分为图像增强类算法和图像复原类算法。前者不考虑降质图像退化原因,而是通过图像增强技术突出场景细节,提高图像对比度,从而提升图像质量;后者分析图像成像机理,构建雾霾天气图像退化的数学模型,然后还原出清晰无雾图像。自适应直方图均衡化、Retinex算法、大气耗散函数算法及暗通道先验去雾算法是常见的去雾算法[4]。自适应直方图均衡化算法是对图像的局部进行操作,通过局部操作增强图像的细节信息[5]。单尺度Retinex算法(single-scale Retinex,SSR算法)是将有雾图像与中心环绕函数卷积得到入射光,通过对数运算获得反射光图像,从而实现去雾效果[6],后续发展形成了多尺度Retinex(multi-scale Retinex,MSR)算法[7]、带颜色保持的多尺度Retinex(multi-scale Retinex with color restoration,MSRCR)算法[8]。Tarel等[9]将大气散射模型中的大气光模型定义为大气耗散函数,通过中值滤波估计出大气耗散函数来实现图像去雾,但该方法容易出现Halo效应。因此,刘子兵等[10]使用像素级融合和滤波的方法、陈丹丹等[11]使用引入修正函数的方法对大气耗散函数进行优化,复原图像效果进一步提高。范迪等[12]提出一种结合大气散射模型与颜色衰减先验的去雾复原模型,复原后的图像清晰度和对比度都得到了较大的提高。He等[13]通过对大量室外无雾图像进行统计得出了暗通道先验理论(dark channel prior, DCP),利用该理论估计场景透射率后由大气散射模型恢复图像。为解决暗通道先验算法在天空区域色彩失真以及处理速度较慢问题,有学者先后提出了改进方法。提璇等[14]提出将有雾图像分割成天空区域和非天空区域,对不满足暗通道先验理论的天空区域引入容差参数修正透射率;李尧羿等[15]使用一种新的天空区域特征先验知识将图像进行分割处理,对天空区域利用暗通道先验和全变分模型进行透射率估计,基于大气散射模型获得去雾后的图像;Tan等[16]对天空区域和景物区分别估计出初略透射率图,然后联合自适应中值滤波和双边滤波对其快速修正细化。
目前的去雾算法还存在着天空区域效果不理想,天空和景物交界处容易出现虚假边缘等问题。本研究在综合分析现有方法基础上,提出对图像进行三分区并针对各区域的特点采用适合的去雾算法,最后对去雾结果进行组合获得最终去雾结果,本算法去雾效果在整体上优于常见算法。
1 三区域去雾算法
常用的几种去雾算法的去雾效果在某些方面不太理想。暗通道先验去雾算法在非天空区域去雾效果比较好,但是对天空及亮度较高的区域去雾效果差。Retinex算法尺度选择比较困难,图像细节恢复方面欠佳。考虑到图像中不同区域间的差异,提出一种基于暗通道先验理论和单尺度Retinex算法的三区域划分的单幅图像去雾算法,算法框架如图1所示。
算法中,图像分为天空、非天空及过渡区三个区域,并根据各区域的特点,分别采用不同的去雾算法进行去雾。在天空区域,采用大尺度的Retinex去雾算法,在去雾的同时避免出现光晕。在非天空区域,细节比较丰富,采用带透射率优化的暗通道去雾算法,以恢复和增强图像细节。在过渡区,分别采用中尺度Retinex去雾算法及暗通道去雾两种方法处理,并对两个去雾结果进行加权融合获得去雾图像。把三个区域的去雾结果组合形成初步去雾图像,再进行自适应直方图增强得到最终的去雾图像。
1.1 非天空区域去雾
非天空区域去雾采用暗通道方法,是基于大气散射模型和暗通道先验的一种去雾算法。大气散射模型[17]可表示为:
I(x)=J(x)t(x)+A(1-t(x))。
(1)
其中,I(x)为观察到的有雾图像,J(x)为场景光线强度即无雾图像,t(x)为透射率,A为大气光亮度值。去雾的目标就是从I(x)中恢复出无雾图像J(x)。
图1 三区域图像去雾算法框架Fig.1 Three-area image dehazing algorithm framework
暗通道先验是He等[12]通过统计大量户外无雾图像发现的,即非天空区域至少有一个通道像素值非常小且接近0。其数学表达为:
(2)
其中,Jdark(x)表示无雾图像的暗通道值,Ω(x)是以像素x为中心的一个局部区域,Jc(y)表示彩色图像J(y)的c颜色通道,c可取R、G、B三种颜色,min(·)是求最小值的函数。
对式(1)的大气散射模型两边同时求暗通道值可得:
Idark(x)=t(x)Jdark(x)+Ac(1-t(x))≈Ac(1-t(x)),
(3)
其中Idark(x)表示有雾图像的暗通道图。分析暗通道先验理论,在使用最小值滤波时,滤波窗口越大,该理论越适用,但是滤波窗口过大,会导致暗通道图中景深突变处出现边缘外溢现象。造成这种现象的原因是在景深突变处像素值相差较大,求取暗通道时会选择该区域较小的像素值作为该区域的暗通道图,从而拉低了亮度较高区域的像素值。滤波窗口越小,暗通道图细节信息越丰富,但是由于高亮度区域不存在暗像素,会导致求取的暗通道图像素值偏高,从而影响图像的恢复效果。由此可见,滤波窗口的选择是求取暗通道图的关键。本研究使用图像宽和高的百分之一作为滤波半径,根据不同图像的大小自适应调整滤波窗口半径。图2展示了三种不同滤波半径下的暗通道图。从图中可以看出,滤波半径越大,边缘扩张现象越严重,使用本研究提出的自适应算法求取的暗通道图在兼顾细节信息的同时,没有出现边缘扩张现象。
将式(2)代入式(3)中,并引入小于1的系数ω以保持远处景物的真实度,可得到透射率t(x)的粗估计:
t(x)=1-ωIdark(x)/Ac。
(4)
将式(4)代入到式(1)中,可得去雾图像J(x)为:
(5)
其中,为了防止出现t(x)趋于零而导致复原图像过亮的问题,为t(x)设置下限t0,一般取值为0.1。全局大气光值A可利用有雾图像估计,首先在Idark(x)中提取亮度前0.1%的像素, 然后在原始有雾图像中找到其对应位置的最高亮度作为A值。非天空区域去雾算法如图3所示。首先由非天空区域图像根据式(2)得到暗通道图,通过暗通道图估计大气光值A和粗估计透射率,采用引导滤波对透射率进行优化,最后根据式(5)获得去雾图像。
图2 不同滤波半径暗通道图Fig.2 Dark channel diagram with different filter radius
图3 非天空区域去雾Fig.3 Defogging in the non-sky area
1.2 天空区域去雾
天空区域不符合暗通道先验理论,且天空区域整体灰度变化平缓,细节少。鉴于此,采用大尺度Retinex算法对图像进行去雾。Retinex算法基于如下成像模型[18]:
S(x,y)=R(x,y)·L(x,y),
(6)
其中:S(x,y)为表示观察到的图像,R(x,y)为反射分量,L(x,y)为光照分量。Retinex算法认为反射分量是景物本身,是恒常无雾的,其去雾方法是从原图像S(x,y)中去除光照分量L(x,y),从而得到反射分量R(x,y)。光照分量L(x,y)可由原始图像S(x,y)和环绕函数F(x,y)卷积估计,即:
L(x,y)=S(x,y)*F(x,y),
(7)
(8)
为方便起见,对式(6)两边取自然对数并整理可得:
g(x,y)=s(x,y)-l(x,y),
(9)
其中,g(x,y)=lnR(x,y),s(x,y)=lnS(x,y),l(x,y)=lnL(x,y)。
将式(7)和式(8)代入式(9)中可得:
g(x,y)=lnS(x,y)-ln[F(x,y)·S(x,y)]。
(10)
则图像的反射分量为:
R(x,y)=eg(x,y)。
(11)
尺度参数C大小的选取与单尺度Retinex的处理效果密切相关。参数C较小时,复原图像局部细节较为突出,图像动态范围压缩能力越强,但会出现颜色失真问题;C较大时,图像色彩保持度较好,算法的动态范围压缩能力有所损失,导致图像的细节信息保留较少。对大气散射模型深入分析可知,图像透射率越大,雾气浓度越小,进入成像设备的光线越多,拍摄的图像越清晰,反之图像越模糊。建立透射率和SSR算法尺度之间的分段函数,如式(12)所示。在兼顾动态压缩范围以及色彩保持度的同时,可以根据不同的雾气浓度选择合适的去雾尺度。
(12)
其中:T表示图像的平均透射率;c′表示基本尺度,经过大量实验发现,取280时去雾效果最好。
1.3 过渡区去雾
为了使天空区和非天空区两个去雾图像更好的衔接,考虑到两区交界附近图像的特殊性,特分出过渡区并采用一套与之适合的去雾算法进行处理。过渡区包含小部分天空和非天空内容,在该区域暗通道先验理论不完全成立,且存在一定量的细节,因此使用中尺度Retinex算法和暗通道先验算法分别对之进行去雾处理,再采用线性加权融合的方法把两幅图像融合起来。融合方法为:
Jtransition(xj)=w1,j×Jdcp(xj)+w2,j×Jssr(xj)。
(13)
其中,Jdcp(xj)为暗通道算法的第j列去雾图像,Jssr(xj)为中尺度Retinex算法的第j列去雾图像。Jtransition(xj)表示两图像融合后的第j列结果,w1,j,w2,j表示两图像的权重系数,且w1,j+w2,j=1,两权重随着空间位置变化而变化。权重系数计算方法如式(14)所示,其中kj表示过渡区第j列的宽度,以像素个数为单位,过渡区第j列从最上边界处为1开始,随着距离的增加i值依次加1。
(14)
2 实验结果与分析
实验是在Windows7操作系统、MATLAB 2017a开发平台上进行。选用五幅有雾图像为处理对象进行去雾实验,并与He算法[12]、Tarel算法[9]、MSR算法[7]和文献[14]算法从主客观两个方面进行对比。
2.1 本算法的去雾实验结果及分析
表1列出了一幅有雾图像及其三个区域的去雾结果。从原图可看到,雾使得远处的建筑及天空模糊不清。从最终去雾结果可看出,天空均匀清晰无光晕,非天空区域的建筑、绿植和船只都非常清晰,尤其是在原图中模糊的建筑经处理后细节清晰可辨。在天空和非天空交界处过渡自然无虚假边缘。
2.2 与其他算法的对比
对五幅图像分别采用He算法[12]、Tarel算法[9]、MSR[7]算法、文献[14]算法以及本算法进行对比实验,结果如表2所示。从表中第二列可以看出,He算法处理后的图像天空区域整体呈现橘红色,颜色失真严重;Tarel算法处理后天空区域失真不严重,但树叶部分细节模糊,“小亭子”没有恢复出来;MSR算法(尺度分别为80、120和180)处理后天空区域出现光晕现象,图像整体偏暗;文献[14]算法处理后非天空区域恢复效果较好,但天空区域和非天空交界处出现偏色问题;本算法处理后天空区域均匀且颜色正常,树叶部分比较清晰,图像整体对比度高。从第三列可以看出,He算法处理后的图像天空区域失真,楼房的纹理不清晰;Tarel算法处理后楼房之间的天空出现色彩紊乱现象;MSR算法(尺度分别为80、120和180)处理后天空部分区域出现白色光斑,非天空区域偏暗;文献[14]算法处理后天空和非天空交界处颜色偏红;本算法处理后楼房纹理清晰,细节信息丰富,图像颜色整体自然。从第四列可以看出,He算法处理后天空区域去雾效果不明显,非天空区域绿色植物模糊严重;Tarel算法处理后楼房顶部出现黑色色块,天空整体呈现灰色;MSR算法(尺度分别为80、120和180)处理后天空部分区域出现大面积光斑,水面颜色偏暗;文献[14]算法处理后图像整体效果较好,但远处的建筑物没有恢复出来;本算法处理后天空区域无光斑、光晕和色彩紊乱的问题,船头部分和建筑物细节清晰,图像整体层次感更加分明,场景真实自然。从第五列可以看出,He算法处理后图像整体亮度偏低;Tarel算法处理后图像亮度较He算法有所提高,但整体去雾效果不佳;MSR算法处理后天空区域出现亮斑,山峰部分去雾不太彻底;文献[14]算法处理后图像去雾彻底,整体效果较好,但树木和山峰交界处出现了失真现象;本算法处理后,图像亮度偏高,天空和非天空区域颜色自然。从第六列可以看出,He算法、Tarel算法、MSR算法处理后的图像整体偏暗;文献[14]算法处理后非天空部分去雾彻底,但天空区域出现白色色块;本算法处理后天空区域颜色均匀自然,船、建筑物等清晰可见,图像整体层次感分明。
表1 本算法实验结果
Tab.1 Experimental results of the algorithm
表2 与其他算法的对比试验结果
Tab.2 Comparison of experimental results with other algorithms
e=(nr-n0)/n0,
(15)
(16)
σ=ns/(dimx×dimy)。
(17)
其中:n0代表原图像I(x)中的可见边数量,nr代表去雾图像J(x)中的可见边数量,φr为无雾图像J(x)中的可见边集合,Pi为无雾图像J(x)中可见边的第i个像素,ri为无雾图像J(x)和有雾图像I(x)在Pi处的梯度之比,ns为纯黑色或纯白色的像素点个数,dimx和dimy分别表示图像的宽和高。
表3 图像质量客观评价Tab.3 Objective evaluation of image quality
3 结束语
针对暗通道去雾在天空区域出现色彩失真,以及Retinex算法图像细节恢复不佳问题,本研究提出了一种三区域划分并基于暗通道先验和单尺度Retinex算法分区进行去雾处理的算法框架。在天空区域采用大尺度Retinex算法去雾,在非天空区域采用暗通道方法去雾,在过渡区把两种算法的去雾结果进行融合。三区域去雾图像组合后采用自适应直方图均衡化增强图像亮度,最终获得去雾结果。实验结果表明,本算法处理后的去雾结果,天空区域无色彩失真和光斑,非天空区域场景细节丰富清晰、对比度强、去雾效果良好,过渡区无虚假边缘、过渡自然。与不同算法的对比及客观评价看,本算法能获得比较好的去雾效果,整体上优于常见算法。虽然本算法取得了较好的去雾效果,但对不同图像的天空区处理时使用固定尺度,下一步工作将根据雾的浓度自适应选择去雾尺度以及根据图像大小分割出不同大小的过渡区。