算法实现在本人的GitHub:https://github.com/wk123467/Picture-defogging.git
算法原理
该算法使用McCarney大气散射模型 I ( x ) = J ( x ) t ( x ) + A ( 1 − t ( x ) ) I(x)=J(x)t(x)+A(1-t(x)) I(x)=J(x)t(x)+A(1−t(x)),其中 I ( x ) I(x) I(x)代表待去雾图片、 J ( x ) J(x) J(x)代表去雾图片、 t ( x ) t(x) t(x)代表大气折射率、 A A A代表大气光值,则可推断出去雾图片 J ( x ) = ( I ( x ) − A ) / t ( x ) + A J(x)=(I(x)-A)/t(x)+A J(x)=(I(x)−A)/t(x)+A。要想推断出去雾图片,需要计算出大气折射率 t ( x ) t(x) t(x)和大气光值 A A A,而他们均需要待去雾图片的暗通道。
原图
暗通道计算方法
- 计算输入图片所有像素点位置在RGB三通道中的最小值,记为darkMat。例如,某个像素点位置的RGB三通道像素值为[r:34, g:45, b:18],则该位置选择像素值为18
- 对darkMat进行最小值滤波(或引导滤波),得到的暗通道示意图如下所示
大气光值计算方法
- 取暗通道前0.1%的像素值位置
- .找出待去雾图片对应的多个像素值位置
- 对这些像素值位置取平均,最终得到一个整数A
大气折射率计算方法
- 该计算方法为
t
(
x
)
=
1
−
ω
×
(
d
a
r
k
M
a
t
A
)
t(x)=1 - \omega \space\times(\frac{darkMat}{A})
t(x)=1−ω ×(AdarkMat),其中
ω
\omega
ω为控制去雾程度,因为图片中包含雾可以使图片拥有纵深,更真实。此时得到的大气折射示意图如下所示
总结
- 通过大气折射模式的简单变换即可得到去雾图片,方便简洁,而且效果好
- 算法中实现了两种图像滤波(引导滤波(图上)、最小值滤波(图下)),得到的结果如下所示。从图中可以观察到引导滤波的效果更好