暗通道去雾

本文围绕基于暗通道先验的图像去雾算法展开。先介绍暗通道先验,指出户外无雾图像大部分非天空区域至少有一通道值趋近零;接着分析雾模型,说明有雾图像公式;然后推导基于暗通道的去雾算法,给出透射率和大气光成分计算方法;最后提到用导向滤波提升去雾图质量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

暗通道先验

  暗通道先验是基于如下观察,在户外的无雾图像中,在大部分非天空区域,至少有一个通道值是很小一个数或趋近于零。因此,对任意一幅图JJJ,给出暗通道JdarkJ^{dark}Jdark的表示:
(1)Jdark(X)=min⁡y∈Ω(x)(min⁡c∈{r,g,b}Jc(Y)),J^{dark}(X)=\min _{y\in \Omega(x)}(\min _{c\in \{r, g, b\}}J^c(Y)),\tag 1Jdark(X)=yΩ(x)min(c{r,g,b}minJc(Y)),(1)
其中两个最小是各通道最小,局部窗口最小。即首先对图像每个像素取三通道中最小值,得到一个单通道图,然后对这个单通道图作最小值滤波就可以得到暗通道图JdarkJ^{dark}Jdark
  作者将造成这个现象的原因归结为以下三点:

  • 各类物体的阴影,玻璃
  • 彩色物体表面,如花草树木,蓝色的水面
  • 黑色物体表面,如树干,石头等

  正因为自然界总是充满了彩色和阴影,就导致了图像暗通道总是很暗。为了验证这个先验知识,作者统计了大量图片,发现基本都符合这个先验。以下是几幅680*1024的风景图在不同大小滤波窗口下的暗通道图:在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
以上图像基本都符合暗通道先验,由此可见暗通道的普遍性。在暗通道先验的基础上,就可以进行去雾算法的推导。


雾模型分析

在计算机视觉和计算机图形领域,一个常用来描述有雾图像的公式表达为:
(2)I(x)=J(x)t(x)+A(1−t(x)),I(x)=J(x)t(x)+A(1-t(x)),\tag2I(x)=J(x)t(x)+A(1t(x)),(2)其中,III表示有雾图像,JJJ是要恢复的无雾的图像,AAA是全球大气光成分, t(x)t(x)t(x)为透射率。
  在这里主要剖析一下这个式子。对这个式子,本身的理解,大气光成分和图像中的景物本身就是真实存在的。晴天和雾天的区别只是大气光成分的多少,表达在这个式子里就是透射率。晴天的时候大气光成分少,物体反射光的透射率很高,几乎让人感受不到大气光成分的存在。雾天则相反。
  放在PS中理解,该模型几乎就是两个图层在不同透明度下的叠加。可以设透明度为α\alphaα。叠加后的图像为I=αI1+(1−α)I2I=\alpha I_1+(1-\alpha)I_2I=αI1+(1α)I2因此,我们假设最大大气光成分为255,可以通过设置不同的透射率来产生不同的有雾图像,同样用上述的图片作实验。
在这里插入图片描述
不过,由于人为选定的t(x)t(x)t(x)在每个像素上都是一致的,所以会丢失景深的感觉。但是已经足以说明雾的生成,和去雾的思路。我们已知雾图,由式(2)去求解无雾的图像。同时,我们用无雾图的暗通道和人为生成t(x)=0.5t(x)=0.5t(x)=0.5的雾图暗通道进行对比。
在这里插入图片描述


基于暗通道的去雾算法

首先假设大气光成分A已知。去雾模型(2)可以化为以下方程:(3)Ic(x)Ac=t(x)Jc(x)Ac+1−t(x).\frac{I^c(x)}{A^c}=t(x)\frac{J^c(x)}{A^c}+1-t(x).\tag3AcIc(x)=t(x)AcJc(x)+1t(x).(3)上标ccc即表示r,g,b三通道。
进一步假设每个滤波窗口内的透射率t(x)t(x)t(x)是常数,记为tˉ(x).\bar t(x).tˉ(x).然后对方程两边同时计算暗通道,即作两次最小值运算,可得下式:(4)min⁡y∈Ω(x)(min⁡cIc(y)Ac)=tˉ(x)min⁡y∈Ω(x)(min⁡cJc(y)Ac)+1−tˉ(x).\min_{y\in \Omega(x)}(\min_c\frac{I^c(y)}{A^c})=\bar t(x)\min_{y\in \Omega (x)}(\min_c\frac{J^c(y)}{A^c})+1-\bar t(x).\tag4yΩ(x)min(cminAcIc(y))=tˉ(x)yΩ(x)min(cminAcJc(y))+1tˉ(x).(4)因为tˉ(x)\bar t(x)tˉ(x)是常量,因此放在最小运算外面。
根据暗通道先验,JJJ趋近于零:(5)Jdark(x)=min⁡y∈Ω(x)(min⁡cJc(y))=0J^{dark}(x)=\min_{y\in\Omega (x)}(\min_cJ^c(y))=0\tag5Jdark(x)=yΩ(x)min(cminJc(y))=0(5)因为AcA^cAc总是正值,可得:(6)min⁡y∈Ω(x)(min⁡cJc(y)Ac)=0.\min_{y\in \Omega (x)}(\min_c\frac{J^c(y)}{A^c})=0.\tag6yΩ(x)min(cminAcJc(y))=0.(6)将式(6)代回式(4),即可简单地得到透射率估计值:(7)tˉ(x)=1−min⁡y∈Ω(x)(min⁡cIc(y)Ac).\bar t(x)=1-\min_{y\in \Omega(x)}(\min_c\frac{I^c(y)}{A^c}).\tag7tˉ(x)=1yΩ(x)min(cminAcIc(y)).(7)同时,即使是晴天,大气光成分还是存在的,尤其是在看远处的物体时给人的感觉更强。这种大气光成分会给人一种景深的层次感,去雾要有所保留。因此,引入一个常量参数ω(0&lt;ω&lt;1)\omega (0&lt;\omega&lt;1)ω(0<ω<1)用来控制去雾的程度:(8)tˉ(x)=1−ωmin⁡y∈Ω(x)(min⁡cIc(y)Ac).\bar t(x)=1-\omega\min_{y\in \Omega(x)}(\min_c\frac{I^c(y)}{A^c}).\tag8tˉ(x)=1ωyΩ(x)min(cminAcIc(y)).(8)作者在文中建议的ω\omegaω为0.95。
  在算法开始的地方就假设AAA是已知,那么具体如何得到A的值。作者在文中给出的方法是,在暗通道中找出前0.1%最亮的点,即透射率最小的点。对于这些点,去雾图中找到对于的点,并取它们中的所有通道最大的值作为AAA的近似。至此,透射率t(x)t(x)t(x),大气光成分AAA,雾图III,都是已知了,就可以求解无雾图:(9)J(x)=I(x)−Amax⁡(t(x),t0)+AJ(x)=\frac{I(x)-A}{\max(t(x),t_0)}+A\tag9J(x)=max(t(x),t0)I(x)A+A(9)其中,t0t_0t0为一个透射率下界。由于直接恢复时,当透射率t(x)t(x)t(x)接近零的时候,由式(2)可知,J(x)t(x)J(x)t(x)J(x)t(x)也为零,这就会失去原图信息,容易引入噪声,因此设置一个下界,在雾密度很大的地方,保留一定数量的雾。t0t_0t0的值一般取0.1。作者还提到,去雾后的图像一般会显得比较暗淡,可以适当增加曝光以得到更好的效果。


导向滤波

  以原图灰度图作为导向图,对透射率图进行导向滤波,可以得到非常精细的透射率图,从而得到高质量的去雾图。这里再以之前人为生成的“雾图”说明导向滤波的效果。
在这里插入图片描述

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值