杨 旭,任世卿,苗 芳
(1.沈阳理工大学 信息科学与工程学院,沈阳 110159;2.辽宁省计量科学研究院,沈阳 110004)
如今世界范围内雾霾天气频繁出现[1],使得采集的图像出现细节模糊、色彩失真等问题。在计算机视觉中很多重要的研究方向如目标跟踪、目标识别等技术都是以足够清晰的输入图像为前提,因此图像去雾具有广阔的应用前景以及很高的理论研究价值。现有的图像去雾技术主要分为两种:一种是基于图像增强的技术[2],不考虑图像降质的原因,旨在增强图像对比度、边缘梯度等细节信息,常用的方法有直方图均衡化[3]、基于RETINEX[4]的去雾算法、同态滤波[5]等,这类方法通常会造成去雾不彻底,产生色彩的偏移,仅适用于部分图像,不具有鲁棒性;另一种是基于图像复原的技术,以大气散射物理模型为基础,提出假设或先验信息等来求解模型中的参数,从而恢复无雾图像。目前基于图像复原的技术中比较常用的是文献[6]提出的基于暗通道先验的去雾算法,通过暗通道图估计透射率,利用软抠图优化透射率,估计大气光值,从而恢复无雾图像;该算法原理简单易行,适合大部分场景,具有很好的鲁棒性,但由于暗通道先验不适用于天空这种过于明亮的区域,造成去雾后的天空区域颜色失真严重且产生大量噪声。李尧羿等[7]通过对天空区域特征统计,得出明亮先验理论来区分天空区域,保留天空区域仅对非天空区域进行暗通道去雾,并采用导向全变分模型来优化透射率。茅天诒等[8]通过K均值聚类结合增强边缘提取来分割出天空区域,修正天空区域的透视率以消除天空区域颜色失真问题。本文针对暗通道去雾后天空区域颜色失真和引入大量噪声的问题,采用图像增强技术对图像进行预处理,利用Canny边缘检测结合形态学操作精确地分割出天空区域,将天空区域由RGB(Red Green Blue)颜色空间转为HIS(Hue Saturation Intensity)颜色空间,仅对亮度分量进行改进的暗通道去雾处理,进而消除天空区域颜色失真。
在雾、雨、雪等恶劣天气下,图像的形成过程受大气中悬浮颗粒的影响较大,由于散射作用,对进入采集设备的入射光和大气光造成很大的衰减。在图像去雾领域中常用恶劣天气的成像模型如公式(1)所示[9]。
I(x)=J(x)t(x)+A(1-t(x))
(1)
式中:x代表图像的像素;I(x)代表雾天最终形成的衰减后的图像,即要进行去雾处理的输入图像;J(x)t(x)代表入射光的衰减,J(x)代表无雾时的清晰图像,即去雾处理后输出的图像;t(x)代表透射率即光线的衰减程度,其取值范围从0到1;A(1-t(x))代表大气光的衰减,A表示大气光强度值,和像素的位置不相关,在暗通道去雾算法中被假设为一个常数。根据式(1)可以看出,想要得到清晰的无雾图像,只需求出透射率t(x)和大气光值A的最优值即可。
文献[6]通过对室外无雾图像的观察,总结出了暗通道先验理论,并且通过5000张不包含天空区域的图像来验证了这一先验的优越性。该先验的内容为:在大多数非天空区域中,至少有一个颜色通道的值非常低且接近零的像素,同样的,在这些区域中的所有像素的最小值接近于零。可以通过公式(2)来描述暗通道先验理论。
(2)
式中:Jdark(x)代表暗通道;W(x)表示像素x的邻域;r、g、b分别代表RGB颜色空间中的3个通道;c代表r、g、b中一个颜色通道;Jc(y)代表无雾图像中像素x邻域内一个颜色通道的值;y代表W(x)内的像素。在无雾图像中像素x的邻域内,所有像素的三个颜色通道强度的最小值趋近于零。
(3)
将公式(2)带入公式(3)即可得到式(4)。
(4)
在暗通道中,将像素按照亮度值由大到小排序,选取前0.1%个像素,在这些像素中选择输入图像中值最大的像素作为大气光值A。
已知大气光值A和透射率t(x),可根据公式(5)恢复无雾图像J(x)。
(5)
当透射率t(x)接近于零时,衰减项J(x)t(x)非常接近于零,直接恢复的无雾图像容易产生噪声。因此,引入透射率t(x)的下界t0。
根据暗通道先验的概念可知其原理并不适用于天空区域,使天空区域的透射率估计出现误差。
(6)
图1展示了使用暗通道先验去雾算法处理的图像效果图。
图1 原图与暗通道去雾比较
由图1可以看到,天空区域像素失真严重,出现了原图天空区域不存在的纹路即噪声。同时在天空区域与非天空区域的交界处产生了明显的白色晕块,这是因为在估计透射率时,假设在W(x)内透射率为恒定值,而当W(x)内像素景深差异较大,远景的透射率值估计偏大,去雾不够既造成了白色晕块的出现。
针对上述出现的缺陷及原因,提出一种基于天空区域分割和HSI空间模型的暗通道先验去雾算法。首先,运用RETINEX算法对输入的有雾图像进行预处理以增强有雾图像的边缘信息,对增强后的图像进行canny边缘检测,同时结合形态学方法精确分割出天空区域;然后,在天空区域选取更准确的大气光值,将图像中的天空区域转换到HSI颜色空间进行处理,并只对亮度分量进行改进的暗通道去雾处理;最后,对非天空区域进行暗通道去雾,产生清晰的图像。
一幅普通室外图像的天空区域相对于非天空区域来说平滑很多,基于这一特点,可以先对图像进行边缘检测,利用形态学操作在尽可能保持原图像结构的情况下将边缘连接起来;对于无边缘的区域或边缘极其稀疏且面积最大的区域即为天空区域,可以通过寻找最大连通域来分割出天空区域。
许多边缘检测算法都是尽可能保留所检测到的所有边缘,但这并不是本文所需要的;最理想的状态是识别出相对完整封闭的边缘,有些图像的天空区域存在一些可以忽略不计的、梯度相对大一点的像素,会被识别为边缘,这会影响最大连通域的寻找。所以本文采用canny边缘检测算法[10],该算法可以分为以下5个步骤:
(1)使用高斯滤波器,以平滑图像、滤除噪声;
(2)计算图像中每个像素的梯度强度和方向;
(3)非极大值抑制;
(4)双阈值检测;
(5)抑制孤立的弱边缘。
其中所应用的(3)、(4)、(5)方法,可以有效地消除边缘检测带来的杂散响应,确定真实的和潜在的边缘。但有雾图像往往不够清晰,导致弱边缘无法识别。文献[8]通过增强边缘梯度来分割出天空区域,即为了获得更为准确的天空区域,在求取梯度图后,适当的提高像素的梯度值,但仅是做线性的提高反而会带来噪声增加的负面效应,所以本文提出对有雾图像进行一次图像增强的预处理,再进行canny边缘检测,这里采用RETINEX算法进行图像增强。
如图2所示,结合图像增强和canny边缘检测的分割效果相比直接用canny边缘检测的分割效果来说,前者更加贴合原图且天空区域与非天空区域的分界线更加连贯,符合本文想要达到的识别出相对完整封闭的边缘,方便了要进行的形态学处理。
采用形态学操作中的闭操作来实现天空区域与非天空区域边界的连贯性,结构元素的选取对处理结果起到至关重要的作用。经过大量实验发现,能使绝大多数图像获得精确地处理结果的结构元素是矩形,而且该矩形的大小也比较统一,该矩形的长为达到天空区域与非天空区域分界线封闭的最小值,与输入图像尺寸有关,该矩形的宽为3个像素。最后寻找最大连通域。处理结果如图3所示,图3a为有雾图像,图3b为天空区域分割图,图3b中的白色区域为天空区域,黑色区域为非天空区域,由图3b可以看出,几乎准确地分割出了天空区域。
图2 边缘检测
图3 使用本文方法分割天空区域
在大多数去雾方法中,大气光值求取的方法是寻找图像中最亮的像素,即模糊图像中最亮的像素被认为是最模糊不透明的。只有天气阴沉,阳光可以被忽略,大气光是场景中唯一的光源时,图像中存在像素在无穷远(t(x)≈0)处,最亮的像素才是最不透明的且近似等于A。考虑到有阳光的情况下,有时整个图像中最亮的像素可比大气光更亮,如白色建筑物、白色汽车等。有雾图像的暗通道近似于雾的厚度,所以在暗通道先验去雾算法中,选取暗通道中前0.1%个最亮的像素作为最模糊不透明的像素集,在这些像素中选择输入图像中值最大的像素作为大气光A的值,以避免定位到比大气光更亮的白色建筑物等区域上。最符合大气光定义的是最模糊不透明区域的像素,即天空区域的像素。所以在已经分割出来的天空区域的暗通道中选取最亮的0.1%像素,在这些像素中输入图像中值最大的像素为大气光A,这样大大提高了大气光值估计的准确率。
天空区域失真的原因是暗通道原理不适用于天空区域,进而造成透射率估计偏小,由于RGB的相关性,偏小的透射率放大了RGB各个通道值的差异,最终造成天空区域像素颜色的失真且引入了大量噪声。
从RGB各个通道间的相关性出发,将天空区域从RGB颜色空间转到HSI颜色空间进行处理。天空区域的景深为无限远处,透射率几乎接近于零,感觉上就是由雾气所形成的,所以有些去雾算法中认为天空区域没有必要进行处理,保留原值即可;但通过对有雾图像天空区域仔细观察可以看出,天空区域是有变化的,主要体现在亮度值的增加,所以只对亮度通道进行暗通道去雾处理,色调和饱和度保持不变,这样就能保证在去除一定雾度的情况下,保持颜色不失真。非天空区域则还是用暗通道去雾方法进行处理。由于软抠图技术太过复杂且耗时较长,所以采用引导滤波[11]代替软抠图技术来优化透射率,处理结果如图4所示。
图4 在天空区域对亮度通道进行暗通道处理的结果对比图
从图4的结果处理可以看出,虽然消除了颜色失真的问题,但由于透射率估计偏小造成过度去雾,表现为亮度下降过多,而且天空中的噪声问题并没有解决。
天空区域十分平滑,直接对亮度通道I进行暗通道去雾,是假设透射率在W(x)内恒定,这样若W(x)小于天空区域,就会造成图4c出现纹路的问题。因为天空区域整体平滑,即景深基本相同,所以设定透射率t(x)在整个天空区域恒定,即以整个天空区域为W(x)来求取暗通道值进而估计透射率,天空区域透射率可以用公式(7)描述。
tsky=maxt(x),x∈Isky(x)
(7)
式中:tsky代表天空区域的恒定透射率;Isky(x)代表输入图像中的天空区域。从式(7)可以看出,透射率tsky等于传统暗通道方法求得的天空区域透射率的最大值,解决了天空区域过度去雾造成的亮度下降的问题。
本文所提出的算法流程如图5所示。
图5 本文算法的流程图
为验证本文所提出算法的有效性,选取3幅图像,分别对本文所提出的去雾算法与传统暗通道算法进行验证,实验结果如图6所示。
图6 实验结果对比图
由图6可知,本文所提供的算法相比于传统暗通道算法,天空区域更自然,视觉效果更好。图6中的三幅图像经本文算法的处理明显消除了去雾后图像的天空区域产生的颜色失真现象。在第二幅和第三幅图像中原始的暗通道算法不但颜色失真还带来了大量的纹路即噪声,本文算法很好地消除了噪声,恢复了天空区域原本平滑的特性。在图6b1中原始的暗通道算法使去雾图像产生了明显的白色光晕;在图6c1采用天空区域与非天空区域分开处理的方法,很好地去除了光晕,得到了清晰的图像。
平均梯度、边缘强度、SSIM结构相似度三个指标可以客观评价去雾效果见表1。其中,平均梯度和边缘强度这两个指标代表了图像的清晰程度即去雾后细节信息是否更加突出,而SSIM结构相似度则代表了去雾后图像相比原图像整体结构的保持效果,可以在一定程度上反应天空区域平滑的保持效果,若是天空区域多了噪声或颜色失真,相应的该指标会减小。就平均梯度来说,图6b1和图6b3的传统暗通道去雾方法的处理结果的值稍高一些,其他指标都是本文算法效果更好,所以从客观的评价指标可以看出本文方法效果更好。
表1 客观评价指标对比
提出的基于天空区域分割和HSI颜色空间的暗通道去雾算法能获得更加清晰自然的图像,解决了暗通道先验不适用于天空区域而产生的颜色失真以及噪声增加的问题,同时也消除了天空区域与非天空区域之间由于景深不连续出现的白色光晕,取得了较好的去雾效果。
本文算法中,如果原始图像整体过于明亮或雾度较浓,尺度若选择不好就会造成天空区域与非天空区域有明显的亮暗差别,过渡不自然,这一问题还须进一步完善和改进。