计算机系统应用  2018, Vol. 27 Issue (6): 118-123   PDF    
改进的暗原色先验去雾算法
杨帅, 张明     
上海海事大学 信息工程学院, 上海 201306
摘要:为了更好的消除图像中部分雾气, 解决传统暗原色先验去雾算法的不足, 提出了一种改进图像去雾算法. 采用自适应取界获取暗原色区域块, 对大气光强进行区间估计, 改进了透射率修复方法, 通过引入一种容错方法, 使算法能更好地处理不满足暗原色先验的强光区域. 实验结果表明, 改进算法能有效去除图像的雾气和强光区域.
关键词: 去雾    自适应    暗原色先验    容错    强光区域    
Improved Haze Removal Algorithm Using Dark Channel Prior
YANG Shuai, ZHANG Ming     
College of Information Engineering, Shanghai Maritime University, Shanghai 201306, China
Abstract: In order to better eliminate the targeted haze in image, an improved haze removal algorithm aiming to solve the shortage of original dark channel prior is proposed. First, the self-adaptive boundary is used to obtain the dark channel region block, and the interval of the atmospheric light intensity is estimated. Then, the transmittance repair method is improved. By including fault tolerance method, the improved algorithm can conveniently deal with the bright area which the original algorithm did not handle. The experimental results show that the improved algorithm can effectively remove the haze and bright area of the image.
Key words: haze-removal     self-adaptive     dark channel prior     fault tolerance     bright area    

对现代计算机视觉系统图像去雾研究[1]而言, 雾霾天气是影响图像清晰度的重要因素之一, 由于大气污染的持续存在, 导致光学传感器获取的图像严重降质, 直接影响航空、海运和道路交通安全. 其中如各类监控系统, 在大雾或者恶劣天气下往往无法正常工作. 因此, 简单有效的图像去雾算法越来越成为计算机视觉系统中不可或缺的部分, 对系统的健壮性和鲁棒性具有一定的意义.

目前, 单幅图像去雾有了很好的研究, 其中包括直方图均衡化算法[2]、同态滤波算法[3]、以及Retinex[4]算法等. 由于雾化的图像质量较低与场景点到成像传感器的距离成指数关联, 导致雾天远近景增强后的场景深度信息丢失, 颜色失真也较为明显. 最新的是基于大气散射场物理模型[5]的方法. 这类方法通过分析图像降质的机理, 基于大气散射场规律建立了图像退化模型, 求解去雾后的图像, 具有内在的优越性. 但是, 这一方法需要掌握大气光强和场景深度. 为了达到较好的应用, 基于单幅图像去雾算法的研究[6]已成为当今热点.

何凯明[7]提出了暗原色先验理论的去雾算法, 在图像信息研究几十年的当今社会, 该理论的诞生发现了图像本质的新特性, 无疑是计算机视觉领域的一大突破. 该算法利用暗原色先验粗估计介质透射率, 并借助软抠图算法细化透射率, 估算出大气光强, 最后基于大气散射场模型复原出无雾图像. 该算法虽然对一般户外图像去雾取得了不错的效果, 但该算法建立在暗原色假设上, 对图像中的强光区域, 透射率估计偏小, 结果出现色彩失真.

本文基于暗原色先验的原理, 对该算法进行了部分改进. 首先, 介绍基于暗原色先验原理的去雾算法; 之后, 分析暗原色先验算法的不足部分, 并加以优化; 最后, 通过实验展示和客观评价表明算法优化的可行性.

1 暗原色先验去雾 1.1 大气散射场模型

在计算机视觉与图像处理中, 公式(1)描述了雾化图像的散射模型:

$\begin{aligned} I(x) & = t\left( x \right)J\left( x \right) + \left( {1 - t\left( x \right)} \right)A \\ & = t\left( x \right)\rho \left( x \right)A + \left( {1 - t\left( x \right)} \right)A\end{aligned}$ (1)

其中, I(x)是去雾前图像强度, J(x)是去雾后图像强度, A是大气光强, t(x)为雾的浓度, 即透射率. 其中前一项t(x)J(x)为像素衰减项, (1–t(x))A为折损光强. 后式ρ(x)为反照率.

1.2 暗原色先验

暗原色先验是基于统计观察户外无雾图像得出的结论: 大部分的无雾图像, 在每个局部区域内都存在着一个或多个颜色通道的强度值很低的像素点, 这些区域就是图像中的暗原色块. 对图像J的定义:

${J^{\rm{dark}}}\left( x \right) = \mathop {\min }\limits_c \left( {\mathop {\min }\limits_{y \in \Omega \left( x \right)} {J^c}\left( y \right)} \right)$ (2)

${J^{\rm{dark}}}\left( x \right)$ 是以x像素点为中点的像素区域块的暗原色, He等人[7]规定15×15像素来划分图像的区域块, ${J^c}$ 代表J的一个颜色通道, 其中c∈{R,G,B}, ${\rm{\Omega }}\left( {{x}} \right)$ 是以x为中心的一块方形区域, 经过大量实验观察, 在每个方形区域总存在灰度值很低的{R,G,B}通道, 抽取出这些块的灰度值, 可以得到该图的暗原色图.

1.3 暗原色先验去雾过程

首先, 通过给定的大气散射场模型, 我们得知了图像雾化的物理模型公式, 假设给定A的情况下, (1)式两边同除A, 并取区域块中各颜色通道的最低灰度值, 变换如下:

$ \mathop {\min }\limits_c \left(\mathop {\min }\limits_{y \in \Omega \left( x \right)} \left( {\frac{{{I^c}\left( y \right)}}{{{A^c}}}} \right)\right) = \tilde t\left( x \right)\mathop {\min }\limits_c \left( {\mathop {\min }\limits_{y \in \Omega \left( x \right)} \frac{{{J^c}\left( x \right)}}{{{A^c}}}} \right) + \left( {1 - \tilde t\left( x \right)} \right) $ (3)

根据暗原色先验的规律, 无雾图像的暗原色项 ${J^{\rm{dark}}}$ 趋近于0, 导出如下公式:

${J^{dark}}\left( x \right) = \mathop {\min }\limits_c \left( {\mathop {\min }\limits_{y \in \Omega \left( x \right)} {J^c}\left( y \right)} \right) \to 0$ (4)

把式(4)带入式(3), 求得透射率为:

$\tilde t\left( x \right) = 1 - \mathop {\min (}\limits_c \mathop {\min }\limits_{y \in \Omega \left( x \right)} \frac{{{I^c}\left( y \right)}}{{{A^c}}})$ (5)

对于处理后的图像而言, 彻底消除雾气的存在, 会导致图像看起来不真实, 所以, 引入一个参数ω(0<ω<1), 加在求取原图区域块的暗原色前, 保留图像远景中的部分雾,ω在文献[7]中取值为0.8, 修改后公式:

$\tilde t\left( x \right) = 1 - {\rm{\omega }}\mathop {\min }\limits_c (\mathop {\min }\limits_{y \in \Omega \left( x \right)} \frac{{{I^c}\left( y \right)}}{{{A^c}}})$ (6)

通过以上方法只能粗略估算出图像中的透射率, 为了提高透射率精度, 应用一种导向滤波(Soft Matting)算法来完善透射率的离散分布函数. 推导出以下公式求解细化后的透射率t.

$\left( {L + \lambda U} \right)t = \lambda \tilde t$ (7)

式(7)中,λ是一个修正参数,L是拉普拉斯矩阵.

通过细化透射率后, 得到的t(x), 由式(8)推算出去雾的图像:

${{J}}\left( {{x}} \right) = \frac{{I\left( x \right) - A}}{{\max \left( {t\left( x \right),{t_0}} \right)}} + {{A}}$ (8)

其中, t0取0.1, A的估算取雾化图的暗原色0.1%亮度最大的像素, 并取其中亮度最大的作为A的固定值. 但是, A并不一定是图像中的最亮点.

对于大部分雾化图像而言, 暗原色先验算法可以取得很好的处理效果, 如图1显示, 颜色恢复较为真实. 图2中显示图像复原后的 ${J^{dark}}$ 灰度分布直方图, 图像整体灰度趋向于0, 说明了暗原色理论的可靠性.

2 改进算法 2.1 自适应取块

本文基于暗原色先验去雾的整个流程, 从每一阶段分析暗原色去雾算法可优化的部分模块. 本文提出用自适应取块的方法改进以上算法的不足. 由于图像数据库里面的图片像素尺寸参差不齐, 如果按照暗原色取块15×15像素的方法, 当处理大像素图片时, 会造成算法的时间复杂度增加, 相反若处理的图像像素过小, 按照暗原色区域块执行程序, 会造成区域块暗原色错误估计, 导致恢复后图像块状化严重, 图像失真. 基于此, 本文采用自适应取块的方法, 取原图分辨率的2%自动调节暗原色区域块. 公式如下:

${{Block}} = {\text{round}}\left( {{\text{max}}\left( {M,N} \right){\text{*}}2{\text{\% }}} \right)$ (9)

上式, Block为暗原色区域块的像素个数(一般以矩阵显示). 这样就可以自适应的为图像分块, 避免了用整齐划一的方式来处理大小不一的图像.

图 1 暗原色先验去雾算法展示

图 2 雾化图像暗原色灰度直方图

2.2 大气光值的估计

暗原色先验去雾算法, 对大气光值A的估计是从暗原色中选取0.1%亮度最大的像素, 然后取这些像素对应于原图像中的最大值作为大气光值. 如果图像暗原色求取中块的尺寸大于天空区域, 天空区域可能会被过滤. 所以, 本文采用区间估计的方法, 提高大气光值估计的鲁棒性.

考虑到原图像的暗原色图中白色物体对大气光值估计的差异, 对(1)式后式两边进行灰度开运算(先腐蚀再膨胀), 可得:

${\hat I^{\rm{dark}}} = {\hat \rho ^{\rm{dark}}}t'\left( x \right)A + \left( {1 - t'\left( x \right)} \right)A$ (10)

式中, 当开运算中元素的尺寸大于 ${I^{\rm{dark}}}$ 中白色物体的尺寸时, ${\hat \rho ^{\rm{dark}}}$ 的取值趋向0. 因此, 式(10)可以改成:

${\hat I^{dark}} = \left( {1 - t'\left( x \right)} \right)A$ (11)

进而推导出 $t'\left( x \right)$ 的表达式:

$t'\left( x \right) = 1 - \frac{{{{\hat I}^{dark}}}}{A}$ (12)

上式, $t'\left( x \right)$ 为透射率 $t\left( x \right)$ 的初始值.

由于 $t'\left( x \right)$ 中像素的取值不大于 $t\left( x \right)$ 中像素的取值, 所以A的取值应大于 ${\hat I^{\rm{dark}}}$ 中像素的最大值, 则A可表示为:

${{A}} \geqslant \max \left( {{{\hat I}^{\rm{dark}}}} \right)$ (13)

又因为, 通常情况下, A的取值不大于原图像中像素的最大值. 故此, A的取值为:

$\max \left( {\mathop {\max }\limits_c {I^c}\left( x \right)} \right) \geqslant {{A}} \geqslant \max \left( {{{\hat I}^{\rm{dark}}}} \right)$ (14)

由式(14)我们可以推出A的区间估计为

$A = \left( {1 - \Delta } \right)\max \left( {\hat I} \right) + \Delta \max \left( {\mathop {\max }\limits_c {I^c}\left( x \right)} \right)$ (15)

式中, Δ为调节系数, 取值范围为 $0 \le \Delta \le 1$ . 本文定义的表达式为:

$\Delta = {\left[ {\prod {{\hat I}^{\rm{dark}}}} \right]^{\frac{1}{n}}}$ (16)

上式所表达的含义是, 对开运算后的 ${\hat I^{\rm{dark}}}$ 中所有元素求其几何均值, n为图像分辨率数比上区域分块的分辨率数, 由于本算法采用的是自适应取块, 所以n具体数值为2.5E+04.

2.3 高斯型双边滤波

图3(b)显示了暗原色先验去雾过程中粗估计的透射率会导致去雾图像产生白边现象, 这种现象是因为雾图中远近景的深度信息影响, 导致边缘差异过大, 从而复原的图像中会出现边界白边现象. 为了解决这种现象, 要对透射率图进行适当的细化和修复处理. He[7]利用的是导向滤波方法. 由于使用预处理共轭梯度算法求解大型稀疏矩阵(Matting Laplacian Matrix[8]), 但是给整个运行过程带来了巨大的计算量, 占用了大量的时间和内存, 限制了算法的推广. 当然这些原因不是制约He[7]方法的关键, 算法最主要的瓶颈还是计算速度和时间复杂度.

本文针对He[7]透射率细化方法复杂度高、运算时间长、不适合实时处理等问题, 结合双边滤波[9]方法, 提出了改进的高斯型双边滤波方法. 该方法不仅可以平滑透射率, 而且很好地保留了边缘信息的突变景深. 最重要的是, 在算法复杂度上双边滤波方法比导向滤波方法有很大幅度地降低, 一定程度上降低了时间复杂度.

图 3 边界白边现象

本文使用高斯型双边滤波, 即空域和值域平滑函数均是高斯函数. 对于透射率 $t'\left( x \right)$ 的粗估计, 利用高斯型双边滤波进行细化操作, 可表示为:

$\begin{array}{*{20}{c}} {t(x) = \frac{1}{{w\left( x \right)}}} \\ {\mathop \sum \limits_{y \in \Omega \left( x \right)} {G_{{h_s}}}\left( {x - y} \right){G_{{h_r}}}\left( {\left| {{I_x} - {I_y}} \right|} \right)t'\left( x \right)} \end{array}$ (17)

式中 $t'\left( x \right)$ 是应用暗原色先验求得的透射率粗估计值, $\Omega \left( x \right)$ 表示中心点(x,y)的(2N+1)*(2N+1)大小的领域窗口, N为双边滤波器的半宽, 其中越大, 表示平滑效果越强. I是图像的强度值. ${G_{{h_s}}}$ ${G_{{h_r}}}$ 为高斯函数. w(x)为归一化系数, 其表达式如下:

$w\left( {{x}} \right) = \mathop \sum \limits_{y \in \Omega \left( x \right)} {G_{{h_s}}}\left( {x - y} \right){G_{{h_r}}}\left( {\left| {{I_x} - {I_y}} \right|} \right)$ (18)

双边滤波器主要参数有: N, hshr. 当滤波领域半径N较小时, hs值接近1, 作用发挥不好; 当N较大时, 会导致时间复杂度增加. 在图像平缓区域, 领域内亮度值比差小, 此时双边滤波转化为高斯低通滤波; 而在图像变剧烈的区域, 边缘点的亮度可以用附近亮度值相近的像素的代替, 所以双边滤波既能平缓图像又可以保持边缘.

本文采用双边滤波对透过率图修复, 进行了平滑和细化处理. 如图4所示. 图中4(b)给出了带雾图像的透射率粗估计图, 可以看出, 图中有明显的块状效应, 细化后图中, He[7]的软件抠图效果最好, 细节明显, 图像层次感强(图4(c)所示); 本文双边滤波参数的选择是: 双边滤波器的半宽N=6.7, 即双边滤波器窗口大小为: 自适应Block; 空域高斯模板hs=5.8, 值域高斯模板hr=0.29. 从结果图中可以看出, 细节信息有所加强, 修复后基本能抓住尖锐边缘的不连续性,并且勾勒出物体的轮廓, 消除白边现象,较之粗估计的结果变得细腻、平滑(图4(d)所示).

图 4 透射率细化图

通过大量的实验比较, 如图5所示, 本文采用的双边滤波修复透射率方法, 可以有效的去处边缘的白边现象, 相比He[7]软抠图细化透射率方法, 具有相似的处理效果, 使得图像突变边缘平滑、细腻、真实率高, 而且图像复原后的去雾能力十分明显, 色彩饱和度和景深信息都到达较好的效果. 最重要的是, 处理的时间较He[7]的方法更短.

图 5 消除白边现象对比图

2.4 透射率容错方法

文献[7]中, 明确说明基于图像中包括天空、偏白色物体、水面等大面积强光区域, 去雾后的区域会有部分背离原图的地方. 为了解决这个难点, 需改进算法, 实现不同场景下雾化图像的去雾能力.

回溯式(3), 在不考虑暗原色假设的前提下, 真实的透射率如下所示:

${t_{real}}\left( x \right) = \frac{{1 - \mathop {\min }\limits_c \left( {\mathop {\min }\limits_{y \in \Omega \left( x \right)} \left( {\frac{{{I^y}}}{{{A^c}}}} \right)} \right)}}{{1 - \mathop {\min }\limits_c \left( {\mathop {\min }\limits_{y \in \Omega \left( x \right)} \left( {\frac{{{J^y}}}{{{A^c}}}} \right)} \right)}}$ (19)

在强光区域, 透射率不会近似为0, 实际的透射率 ${t_{real}}\left( x \right)$ 要大于暗原色先验细化估计的透射率 $t\left( x \right)$ . 假设在强光区域, 应用暗原色先验原理, 该区域的{R,G,B}颜色通道不会有明显的暗色道, 都接近白的灰度级1(归一化). $I\left( x \right) - A$ , 是三通道的灰度级综合求彩色图像. 所以, 当3通道方向不一致(有的通道大于A, 有的通道小于A)时, 通道间颜色值的差异会被放大, 即使t0=0.1, 差异也会被放大. 这样就会产生, 强光区域自然色的色偏和不和谐, 即色彩失真. 如图6所示.

图 6 强光区域的雾化图像处理图

综上可见, 如果想保留原图的真实色彩, 就必须调整光强区域的透射率, 使得估计值更加接近 ${t_{\rm{real}}}\left( x \right)$ , 同时又不破坏暗原色先验去雾的模型. 基于此, 文献[10]等提出定义一个容差参数K对图像中强光区域进行区分. 但是该算子, 虽然可以区分弱光区和强光区, 但是在最后强光区处理的效果上显示的色彩饱和度过高, 图像对比度过强, 失去了图像的真实感, 如图7(b)所示. 所以, 本文提出容差方法是建立在文献[10]的基础上, 对该算子的进一步优化, 使得强光区的去雾效果更真实.

本文在大量实验数据的结果上, 提出了一种比容性透射率容差方法. 公式如下:

$ \mathop t\nolimits^{''} (x) = \max \left( { {1 - \frac{{n\left| {I\left( X \right) - A} \right|}}{{\sum {I^{\rm{dark}}}}}\left( {1 - t\left( x \right)} \right)} {,\max \left( {t\left( x \right),{t_0}} \right)} } \right) $ (20)

上式中, $t''\left( x \right)$ 为比容性容差修正的透射率, $t\left( x \right)$ 为暗原色先验估计细化的透射率, n是本文算法提出的暗原色区域块数, $\mathop \sum \nolimits^ {I^{\rm{dark}}}$ 是对暗原色图中所有的灰度值累加的和, 本文规定 $\left| {I\left( X \right) - A} \right| \le \left( {\mathop \sum \nolimits^ {I^{\rm{dark}}}} \right)/n$ 为强光区, 此时重新计算透射率, 反之认为是弱光区, 满足暗原色先验的区域, 可以进行去雾算法. 本文算法改进了强光区的透射率, 使得其不会偏向t0. 这种方法是对暗原色先验的补充和优化, 使其不但可以处理弱光区, 而且还可以正确的左右于强光区. 简言之, 对接近大气光强A的区域把去雾能力降到最低, 因为从真实的视觉考虑, 雾气在这些较白的区域里面也不是很明显, 就是弱化处理该区域, 使得图像真实立体感更强. 图7展示了文献[7]和[10]以及本文算法的去雾图像.

为了更加实际的看出强光区域(图7红色矩形区域)去雾后的三原色差异, 本文通过实验展示了文献[7]、文献[10]以及本文算法去雾后的{R,G,B}通道的灰度直方图. 如图8所示.

图 7 强光区域的雾化图像处理图

如上可得, 本文算法去雾后强光区域{R,G,B}通道灰度值更大, 更接近实物颜色.

3 实验与分析

本文操作是在一台处理器为2.30 GHz的Intel (R) Core (TM) i5-6300HQ CPU的PC机上处理雾化图像. 平台是Matlab 2016a.

实验效果如上几节图中所展示. 本文选取客观评价, 先对比图5中本文算法和文献[7]暗原色先验算法的时间复杂度的大小, 通常时间复杂度O(n)越大, 说明运行时间越长, CPU的开销越大. 评价数据如表1所示.

可见, 本文的双边滤波细化透射率的方法有较好的运行时间, 虽然图像深度效果上不比暗原色先验软抠图细化透射率的方法柔和, 但是一定程度上达到人的视觉欣赏特点, 并且图像突变部分显得比较平滑清晰, 最主要的是, 运行时间较少, 有利于算法的扩散与复用.

最后, 对比图7强光区域的色彩效果, 本文从细节、色调及结果信息方面来验证本算法的通用性. 评测数据如表2所示.

图 8 强光区域的雾化图像处理图

表 1 时间复杂度比较(单位: s)

表 2 图7去雾算法质量评测

从评测可见, 文献[7]算法和文献[10]在图像细节和结构信息中和本文算法差异很小, 说明soft matting在图像细节处理方面很到位, 而色调方面即饱和度, 文献[10]算法色调偏亮, 图像去雾后颜色比较鲜艳. 综上所述, 本文算法在图像保质方面同样具有不错的效果.

4 结束语

通过对暗原色先验理论的研究, 发现该理论虽然存在部分的不足, 但大体上对雾化图像的去雾效果仍有空前的效果. 本文针对原理的部分不足, 做出了细致的优化与改进, 但是时间与质量往往都是均衡的, 本文只能做到在图像能保真的情况下, 相应的提上图像处理的速度. 本文通过各种方优化暗原色先验的透射率以及图像中的大气光A的准确估计, 同时使用双边滤波器处理去雾图像白边现象, 不仅保证了图像的平滑和清晰, 而且降低了算法的运行时间, 最后通过对透射率的限定, 可以对图像中强光区域进行弱处理来改进图像去雾后色彩失真现象.

参考文献
[1]
吴迪, 朱青松. 图像去雾的最新研究进展. 自动化学报, 2015, 41(2): 221-239.
[2]
艾明晶, 戴隆忠, 曹庆华. 雾天环境下自适应图像增强去雾方法研究. 计算机仿真, 2009, 26(7): 244-247.
[3]
张新明, 沈兰荪. 基于小波的同态滤波器用于图像对比度增强. 电子学报, 2001, 29(4): 531-533.
[4]
刘海波, 杨杰, 吴正平, 等. 基于暗通道先验和Retinex理论的快速单幅图像去雾方法. 自动化学报, 2015, 41(7): 1264-1273.
[5]
孙伟, 李大健, 刘宏娟, 等. 基于大气散射模型的单幅图像快速去雾. 光学 精密工程, 2013, 21(4): 1040-1046.
[6]
毕笃彦, 葛渊, 李权合, 等. 单幅图像去雾方法研究. 空军工程大学学报(自然科学版), 2013, 14(6): 46-53.
[7]
He KM, Sun J, Tang XO. Single image haze removal using dark channel prior. Proceedings of 2009 IEEE Conference on Computer Vision and Pattern Recognition. Miami, FL, USA. 2009. 1956–1963.
[8]
He KM, Sun J, Tang XO. Fast matting using large kernel matting Laplacian matrices. Proceedings of 2010 IEEE Conference on Computer Vision and Pattern Recognition. San Francisco, CA, USA. 2010. 2165–2172.
[9]
孙抗, 汪渤, 周志强, 等. 基于双边滤波的实时图像去雾技术研究. 北京理工大学学报, 2011, 31(7): 810-813, 822.
[10]
蒋建国, 侯天峰, 齐美彬. 改进的基于暗原色先验的图像去雾算法. 电路与系统学报, 2011, 16(2): 7-12.