最近闲来无事尝试了一下去雾算法的效果,从随便搜集到的资料来看多数算法是用于白天带雾图像去雾的,少部分是研究夜间带雾图像去雾的。而白天的去雾算法有很多都衍生自何博士的《Single Image Haze Removal Using Dark Channel Prior》,可见何博士算法之经典。我也只是把别人整理过的算法看懂,并写代码验证效果,并无创新,权当记录。
该算法用到了一个暗通道先验“Dark Channel Prior”,它的含义是:对于图片中绝大对数的非天空区域,总有在某些色彩通道具有很小的值,原作者测试了好多图片都证明该先验是正确的,暗通道的表达式如下:
式中Jc表示彩色图像的每个通道的值,Ω(x)表示以像素x为中心的一个窗口。可以看出获取暗通道就是获取一个窗口内所有像素的各个通道的最小值。
式(5)的意义用代码表达也很简单,首先求出每个像素RGB分量中的最小值,存入一副和原始图像大小相同的灰度图中,然后再对这幅灰度图按窗口进行最小值滤波,窗口大小与滤波半径的关系为WindowSize = 2*Radius + 1;
暗通道的先验理论指出暗通道的值是趋近于0的,即:
实际生活中造成暗原色中低通道值主要有三个因素:a)汽车、建筑物和城市中玻璃窗户的阴影,或者是树叶、树与岩石等自然景观的投影;b)色彩鲜艳的物体或表面,在RGB的三个通道中有些通道的值很低(比如绿色的草地/树/植物,红色或黄色的花朵/叶子,或者蓝色的水面);c)颜色较暗的物体或者表面,例如灰暗色的树干和石头。总之,我们白天看到的清晰的图像中总是有阴影或者彩色的物体,这些景物的暗通道值是很小的。
业界广为使用的雾图形成模型用表达式表示如下:
I(x)=J(x)t(x)+A(1-t(x)) (1)
假设在一个窗口内的透射率是固定值,用表示,则对(7)在一个窗口求最小值
其中,I(x)就是已有的带雾图像,J(x)是期望的无雾图像,A是全球大气光成分, t(x)为透射率。现在的已知条件就是I(x),要求目标值J(x)。如果知道A和t(x)就能求出J(x),还好我们有暗通道先验。
由(1)得到
考虑到一个像素点由RGB三个通道组成,各个通道都需要恢复,用c表示RGB各通道,
假设在一个窗口内的透射率是固定值,用表示,则对(7)在一个窗口求最小值
上式中,J(y)是待求的无雾的图像,根据前述的暗原色先验理论有:
因此
由(8)和(10)得到