一种改进的基于暗通道先验去雾算法
2019-04-01何立风刘艳玲
何立风 钟 岩 刘艳玲 姚 斌
1(陕西科技大学电气与信息工程学院 陕西 西安 710021)2(日本爱知县立大学信息科学学院 日本 爱知县 480-1198)
0 引 言
因为雾霾天气一直影响人们的正常生活,研究去雾的一些算法也相继出现,去雾领域的研究在近年来逐渐热门,从捕获的图像中去除雾、霾,恢复图像原本的色彩,成为一个较为重要的研究课题。
目前,国内外学者对去雾算法的研究主要分为两类。一类是依靠图像的各种先验知识[1](例如:暗通道[2]、颜色衰减[3]、雾线[4]、对比度[5]等)来辅助估计透射图[6],其中暗通道先验算法则是以He算法为代表,He算法去雾整体效果较好,但存在以下缺陷:(1) 当图像中存在大面积天空区域时,天空区域的雾霾没有被去除掉,这是因为天空区域的像素点R、G、B三通道像素值均不趋近于0;(2) 在去雾过程中求取透射率图时,存在大量浮点数计算,导致整个程序运行时间缓慢,无法达到实时去雾的要求。另一类是基于深度学习[7]的方法,可以说是运用了非常强大的非线性模型[8],利用大量的有雾、无雾图像的数据对,对透射图进行估计,因此一般能够得到超越传统方法的结果。但是基于机器学习[9]的算法在不同数据上的泛化性也是一个未知数。
本文在He算法的基础上,发现由于带雾图像中局部区域暗通道分量不趋近于0,且不能满足实时去雾的情况下,提出了一种对大气光值改进的方案。首先计算像素值R、G、B三通道的方差来判断当前像素点是否存在暗通道值,若不存在,则通过区域窗口中最小的暗通道值作为当前像素点的暗通道值,这样就可以得到一个较为准确的大气光值;然后先通过对图像进行下采样,求出原图的缩略图的透射率,再通过上采样或插值的方式还原出原图粗糙的透射率,作导向滤波细化,这样图像复原的效果相较于其他算法有大幅度提升,并且程序运行时间也大大缩短;最后针对天空区域将RGB颜色空间转为HSI颜色空间,对其进行图像复原。结合大气散射模型以及求得的精准透射率和天空区域的大气光值,将天空带雾区域有效快速的进行去雾。
1 暗通道先验算法
在去雾领域中,通常使用大气散射模型来描述这类问题:
Img(x)=J(x)t(x)+A(1-t(x))
(1)
t(x)=e-θD(x)
(2)
式中:Img(x)是我们采集的带雾图像,J(x)是实验结果输出的无雾图像,A是大气散射模型中的全局大气光值,t(x)表示透射率,θ表示大气散射系数,D(x)表示景物深度。物理模型去雾的本质为根据已知的Img(x),求解未知的J(x)、A和t(x)。
暗通道先验去雾算法认为,在大部分非天空的区域里,某一些像素肯定有一种或以上的颜色通道具有很低的值,也就是该区域光强度的最小值是个趋近于0的值,可用公式描述如下:
(3)
式中:Jc表示色彩的R、G、B任一通道,设定Ω(x)为大小为奇数,中心为x的一个窗口,根据暗通道先验,假设这些小的数值趋近于0,则可以进一步推导出式(1)中J(x)项趋近于0,因此可以在式(1)中推导出t(x)的估计值:
(4)
全局大气光A的求取:首先将暗通道图所有像素点按亮度像素值大小排序,抽取前0.1%像素值最大的像素点,然后将这些像素位置标记好,在原始带雾图像中找到这些标记的位置,找到像素值最高的点,其像素值作为大气光值A,由于t(x)的值在估计时会有误差,在暗通道先验中设定阈值t0=0.1,使得最终的恢复公式如下:
(5)
暗通道去雾算法是近年来单幅图像去雾算法中比较主流的一种方法。此方法虽然在去雾方面取得不错的效果,但是算法本身存在一些问题:在透射率t(x)估计时,当带雾图像中局部像素的R、G、B通道中的像素值都不趋近于0,此时得到的透射率就过于粗糙,图像恢复[10]会有很多误差,如图1所示。
(a) 带雾图像 (b) 暗通道
(c) 透射率t (d) 恢复图像图1 暗通道先验算法
图1(d)就是利用暗通道原理恢复得到的无雾图像图。透射率t的估计过于粗糙,且大气光值的选取有待商榷。因为在图中某些像素点的R、G、B三通道像素值都没有趋近于0,所以不符合暗通道先验这个条件,导致在根据式(5)复原的过程中,图像的上半部分区域的结果出现失真[11]、色彩混乱的情况,致使图(d)中恢复的无雾图像并不理想。
本文就大气光值的选取,透射率图的细化,图像复原后的处理三个方面进行了改进。实验结果发现,大气光值的精确选取消除了局部区域色彩分量不趋近于0造成的失真缺陷;提取透射率图方法的改进提高了程序的运行速度;HIS模型[12]图像复原更加符合人类对色彩空间的认知。
2 改进算法
针对以上分析,本文对暗通道先验算法进行如下改进:将大气光值的选取进行优化;透射率图的估计先局部处理再进行滤波;复原后的图像通过图像增强技术再进行二次处理。
2.1 大气光值的优化
在暗通道先验算法中,大气光值A的取值具体步骤如下:
(1) 在暗通道图中对像素值得大小排序,抽取出其中像素值最大的前0.1%像素点,并标记好这些像素的下标。
(2) 在这些下标中,找到原始带雾图像img中对应下标的点,这些点中像素值最大的作为大气光A的值。
这样的大气光值A有以下的问题:当局部像素点的R、G、B三通道的像素值都不趋近于0,且像素值大小都相近。此时,得到的暗通道图中,此局部像素点的暗通道图的像素值就是一个不精确的值,从而选取的大气光值A就出现偏差。
针对此问题,本文提出一种改进方法,在提取暗通道图时,设定一个阈值T1,当局部像素点R、G、B三通道像素值的方差大于阈值T1时,说明此像素点三通道的像素值波动很大,可以取其最小的值选做是暗通道图的一部分。局部像素点的均值和方差由式(6)、式(7)计算所得。
(6)
(7)
当局部像素点R、G、B三通道像素值的方差小于阈值T时,说明此像素点三通道的像素值波动不大,无法取得对应的暗通道像素值,此时其暗通道值由窗口中其他像素点的三通道中最小值的均值确定,如式(8)所示,其中,窗口区域大小为W,像素点img(i,j)。
(8)
实验证明,通过该方法得到的大气光值较为平滑、稳定,对局部色彩分量不趋近于0的区域进行精准估计,从而得到优化的大气光值,为后续的图像复原工作提供有力的支持。
2.2 透射率的精确估计
2.2.1 He的透射率估计
He的算法效果针对大部分带雾图像去雾效果都较为不错,但是存在的问题也是很明显的。例如在计算透射率图时,会有大量的计算导致程序运行速度太慢,很难达到实时去雾的要求。
2.2.2 本文的透射率估计
本文通过对透射率图的计算方式上进行一些改变,通过对透射率图精度需求的下降,提高透射率图计算速度,这样加快程序的执行速度。
首先,求取原图的缩略图,也就是原图的下采样,使得图像大部分的细节还存在,丢失部分细节;其次求取缩略图的透射率图,这样就可以减少计算量,加快程序运行速度,再通过三次内插法或双线性内插法来获取原图的透射率图;最后对求得的透射率图用导向滤波精确化。计算过程如图2所示。
图2 计算透射率流程图
对一幅1 024×768的带雾图像进行透射率图的估计,本文的算法得出的透射率图在大部分细节上几乎一致,效果良好,但在算法运行时间上大幅提高,具体如图3及表1所示。
(a) 带雾图像 (b) He算法透射率图
(c) 带雾图像 (d) 本文透射率图图3 透射率图估计的对比
表1 不同算法对透射率图估计的时间
实验结果发现,针对一幅1 024×768的带雾图像处理只需要30 ms左右,640×480大小的带雾图像处理只需大约27 ms,而He算法需要三倍以上的时间才能完成,所以本文算法在执行速度上满足较多实时应用场景。
2.3 图像复原
2.3.1 He的复原算法
式(5)中的各个变量通过前面的步骤都已经给出说明,这里不再重复,最后进行计算即可。方法上简单易懂,只是通过带雾图像I(x)、大气光值A,透射率图t(x),三个参数的值来复原出去雾图像J(x)。在有些实例中,去雾效果并不好,在图像的色彩上还存在较大问题,如图4所示。
(a) 带雾图 (b) 去雾后的图图4 He算法复原效果图
He算法针对类似图4的实例,由于过度去雾造成图像中局部区域的色彩失真,使得原图的恢复结果产生明显色差问题。
2.3.2 本文的复原方法
以上问题是在RGB色彩空间复原的,出现了部分区域恢复不清晰问题,本文算法是将图像的RGB色彩空间转化为HSI色彩空间,从而实现图像复原的方法。HIS色彩空间是用色调(H)、饱和度(S)、亮度(L)来描述色彩,因为选择HSI模型符合人们对颜色的识别。
在处理彩色图像时,可以只对I分量进行处理,结果不改变原图像中的彩色种类;将RGB空间色彩转化到HSI空间中,结合非天空和天空区域的亮度信息、色调信息、饱和度信息,可以更好地避免过度去雾图像色彩失真的情况,从而得到较好的去雾效果。
3 实验结果分析
在验证本文算法的可行性和有效性时,本文选取了多种场景下的多种带雾图像,在运行本文算法的同时,使用He算法、中值滤波算法、均值滤波算法、多尺度Retinex算法对图像进行去雾处理。实验使用清华同方台式机,处理器为Inter(R) Core(TM) i7-6700 CPU 3.4 GHz,内存8 GB,软件平台为MATLAB 2016a。
3.1 大气光值的分析
因为在图像中某些像素的R、G、B三通道像素值都没有趋近于0,导致在根据式(5)复原的过程中,图像的局部区域出现失真,色彩混乱的情况。本文算法通过对每个像素的R、G、B色彩分量进行筛选,挑选出符合暗通道原理的像素点,那些不符合特定阈值的像素点通过其局部像素点的均值得出暗通道图对应像素点的像素值。综上所述,得出的暗通道图就较为精确,从而得到的大气光值也较为平滑,不会造成图像局部色彩失真的情况。
3.2 透射率图的分析
He等的透射率图估计整体效果较好,但局部区域存在明显的缺陷,通过本文的算法,透射率图的估计由以下步骤得出。
通过对原图的下采样,得到原图的缩略图,选择分辨率适当的缩略图,因为分辨率较低时,图像中的部分细节存在失真现象,所以我们需要选择合适的大小的缩略图。求出当前缩略图的透射率图,然后再通过插值的方法得到原图的透射率图,这样的透射率图精度和原方案的透射率图效果一致,但是速度上明显要高于He算法透射率图求取的速度。通过求得原图大小合适的缩略图,再利用插值的方法求得原图的透射率图,在运行速度上相比He以及其他算法有较大的提升,且透射率图的效果也是几乎一致的。
3.3 去雾结果分析
在实际去雾过程中,针对大面积天空带雾图像,如图5所示,He的算法得出的透射率图整体效果较好,复原的无雾图像整体偏暗,局部会有色彩失真的问题,本文算法正好克服了这些不足,得出的透射率图更精确,从而复原的无雾图像更清晰可见。
图5 不同场景各算法去雾效果对比
图5中分别有4种带雾图像,从不含天空区域和包含天空区域两种图像来测试各种算法的去雾效果。从结果可知,He算法相对于中值/均值滤波等算法去雾效果较为明显,带雾图像中第1、2幅都是不含天空,图像中的车、街道、房屋等目标通过本文算法都恢复的较为清晰,Retinex算法对于带浓雾图像的去雾都会有局部色彩失真的情况;带雾图像中第3、4幅图选取有大部分天空的图像,He算法和中值或均值算法的效果几乎没有将天空区域恢复出来,所选取的大气光值在算法本身是存在一些缺陷的;Retinex算法恢复的天空区域部分偏白,去雾效果不足,而本文算法改进大气光值的选取,从而克服这一缺陷,天空区域的颜色与实际场景趋近一致。
在程序运行时间上,如表2所示,本文和其他算法进行了对比,对不同大小尺寸的图像进行去雾结果对比。
表2 各算法对不同大小图像去雾的运行时间
由表2可知,针对一幅彩色带雾图像去雾时,通过对透射率图的改进,整体算法运行时间缩短50%以上,在保持透射率精度的同时加快速度,加上大气光值和图像复原的改进,得到较为明显的去雾结果,在去雾效果和速度上达到了实际生活中实时去雾的要求。
4 结 语
本文是在He算法的基础上,通过改进大气光值的选取,透射率图的精确估计,以及图像复原利用HSI空间的特性,更加符合人类对颜色空间的认知。一系列改进方法进行实时去雾,不仅在去雾程度上更加优化,同时在实验处理速度上也大幅缩短时间,达到了实时去雾的效果。然而在实验过程中发现提取透射率图时可以通过SSE代码优化去处理浮点数计算的方式加快程序运行速度,这种通过硬件再对代码进一步加速是以后继续研究的方向;同时在复杂场景中不仅仅是去雾,而且可以通过去雾去检测运动目标的一些方法也是我们需要研究的内容。