暗通道去雾算法优化

发布时间 2023-09-17 14:46:40作者: qianglearning

1、前言

传统去雾算法暗通道先验去雾算法是比较经典算法。

2、原理

2.1、暗通道

暗通道先验来源是作者通过几千张图像统计发现,即在绝大多数非天空的局部区域里,某一些像素总会有至少一个颜色通道具有很低的值,也就是说该区域光强是一个很小的值。

对于任何输入图像\(J\),其暗通道数学表达式如下:

\[J^{dark}(x) =\underset{y\in{\Omega(x)}}{min}({\underset{c\in\{r,g,b\}}{min}}J^{c}(y)) \]

其中$ J^{c}\(表示彩色图像每个通道,\) \Omega(x) $表示以像素X为中心的一个窗口。要求暗通道的图像是比较容易的,先求出每个像素在3个通道的最小值,存到一个二维Mat中(灰度图),然后做一个最小值滤波,滤波的半径由窗口大小决定,这里窗口大小为WindowSize

效果图如下

1.室外图像

image

​ 图像来源于 MIT-Adobe-5K 数据集

2.有雾图像

image

​ 图像来源于 MIT-Adobe-5K 数据集

从上面的原图 - 暗通道对,可以发现,无雾图像中非天空区域,即使图像曝光良好,rgb 三个通道中通常存在一个通道的某些像素值很低,接近于 0。相比之下,有雾图像,即使在红色,蓝色,绿色这些区域,其暗通道区域都远大于 0,虽然不是很明显,但相比无雾图像,就远大于 0 了。

但在纯白色的区域,如下面这张图,蓝天其暗通道,在天空区域灰度值很低,反而是下面的灰白色平地灰度值很高。

image

将上述规律表达为

\[J^{dark}(k) =\underset{y\in{\Omega(x)}}{min}({\underset{c\in\{r,g,b\}}{min}}J^{c}(y)) \approx0 \]

其中, $ J $是无雾图像, $ k$ 代表图像中的一个点坐标,遍历 r,g,b 通道,每个通道通道中以 k为中心的局部窗口 ,找一个最小值。

2.2、雾天退化模型

\[I = t.J + (1-t)*A \]

模型中,单图去雾的目标已知\(I\),估计\(A\),\(t\),即可得到无雾图像\(J\)

估计 A

估计全局大气光的方法有很多,最简单的就是选取全图最亮的点,像天空这种,雾气感最强,可以认为无限远,经过长距离的散射, t值几乎等于 0,观测到的值

\[I(k) \approx(1-t(k)).A(k)=A(k)=A \]

粗超估计A为全局值。

从观测图像的暗通道\(I^{dark}\)中选取最亮的前0.1%的点,这些点对应到原图\(I\)中再去找最亮的点作为A的估计

估计 t

目前给定有雾图像 \(I\),就可以根据其暗通道直接估计 \(A\) ,还需要估计一个 \(t\)

在雾天退化模型中\(I = t.J + (1-t)*A\) 取其暗通道,然后找局部最小值,可以近似认为\(t.J=0\),得到\(I=(1-t).A\),其中\(A\)\(I\)已知,即可直接求\(t\)

求解 J

根据前面,已知 \(I\),\(A\),\(t\) ,根据雾天退化模型\(I = t.J+(1-t).A\) ,则\(J = \frac{I-A}{t}+A\)

效果如下
image

image

可以明显看出天空容易出现颜色异常

3、优化

3.1、天空部分优化

由于天空区域不符合暗通道先验的假设,因此很容易想到首先将天空分割出来单独处理。只需要将天空大致轮廓分割出来即、具体步骤很简单:

step1:kmean聚类分割出候选天空,采用kmean算法 k值选4,选取平均灰度值最大的类别为天空类,获取的区域会存在非天空区域

step2: 将kmean获取候选天空区域,采用边缘检测算子求灰度图像的梯度信息,按照设定梯度阈值和亮度阈值对梯度信息进行区分获取二值图,从而去除非天空区域

step3: 对二值图做形态学处理;判断二值图对应灰度图区域的灰度均值,如果均值大于阈值 则认为是天空,否则为非天空。此时获取的天空区域大概轮廓。

效果如下图
image

image
无天空时
image
image

对于天空区域的暗通道优化为

DarkChannel[Y]= (SkyPresrve * Sky[Y] + DarkChannel[Y] * (255 - Sky[Y])) / 255 ; 

其中SkyPresrve就类似于论文的固定透射率值,是用户指定的,在上式中,若Sky[255],即完全属于天空,则改点的透射率即为固定值,若Sky[Y]=0,即完全不属于天空,计算式的值不变,不影响正常去雾。

3.2、大气光值A

关于大气光值A的计算,论文提出了以获得的天空部位的像素的平均值作为A,这也是非常合理的,但是在实际处理时,针对有些完全没有天空部分的图像,可能检测到的天空区域很小(明显属于误检,但是程序不知道的),这个时候以此为大气光值,也是不合理的。

优化后

step1:计算天空部位计算的A值

step2:判断在检测天空像素占整个图像的比例,如果比例小于阈值则从暗通道图中按照亮度的大小取前0.1%的像素的均值。

3.3、透射率t

去雾图像在明亮区域出现颜色失真现象的原因是该区域内的透射率偏小,因此,可以对该区域内的透射率进行修正,从而解决颜色失真现象。本文中引入一个变量来描述像素点隶属明亮区域的程度。

\[S(x) = \frac{min_{c\in(r,g,b)}I^{c}(x)}{max_{c\in(r,g,b)}I^{c}(x)} \]

\[D(x) = \frac{min_{c\in(r,g,b)}I^{c}(x)}{A} \]

\[\delta(x) = min(({S(x)*D(x)})^6, 1) \]

其中S为像素点RGB三通道中最小值与最大值之比,变量D可在一定程度上表示像素点离大气光点的相对距离,暗区域内,暗通道值趋近于0,D逼近0,而在明亮区域内,暗通道值较大,D逼近1。\(\delta(x)\)可以在一定程度上描述像素点隶属明亮区域的程度

透射率t修正为\(\hat{t}=t+a*\delta\),其中a为修正系数,可以控制明亮区域的去雾程度,a取值过小时,明亮区域的透射率未得到有效增强,颜色失真现象不能得到有效解决。a取值过大时,明亮区域透射率将趋近于1.

性能:笔记本:cpu intel i5-12500H 输入图像2560x1920 耗时:25ms

效果如下图
image
image
image
image
image
image
image
image

image

image

参考资料

Single Image Haze Removal Using Dark Channel Prior

图像处理基础(二)暗通道先验去雾

避免图像去雾算法中让天空部分出现过增强的一种简易方法

<<单幅图像去雾算法的研究及应用_梅康>>