1. 简介
该算法由一个韩国人提出,论文原文pdf版地址:https://download.csdn.net/download/HIVAN1/12188573,该论文中提出的优化对比度增强算法即可用于图像去雾,也可用于视频去雾,本文主要讲解图像去雾核心思想和方法,视频去雾只是增加临时一致性因子来消除去雾后的帧间差异。
2. 算法思想
算法还是基于以下大气散射模型
根据上式,最终无雾图像由下式得到:
由上式可知,要得到无雾图像J,需要先求出透射率t,以及大气光A。整个算法就围绕如何求上述两个量而展开。
作者认为雾的存在降低了图像对比度,因此,去雾实际上是增加图像对比度,但是增加对比度的同时,会导致图像像素值超出0-255这个范围,导致信息量的损失。因而,作者要提出的去雾算法必须权衡这两者的关系,最大限度提升对比度的同时,带来最小信息量的损失。
基于上述两点考虑,作者提出两个公式,如下图所示:
上图是优化对比度公式
上图是信息损失公式,最终的权衡函数如图所示:
算法的目标就是最小化这个E值。
下面对上面几个公式进行汉语解释,可能有点拗口,就是记录一下便于下次看的时候理解。
在讲解之前,我们先做这样一个假设,假设已经求出了大气光A值,然后随便取了一个t值,该t值对整幅图像都相同,通过去雾公式,计算去雾之后的图像J。
优化对比度公式就是图像J每个通道、每个位置的像素值,减去对应通道均值的平方和,再对平方和求均值。即求彩色图像的方差。 作者代码中为了优化计算速度,实现上并不是计算的方差,而是各通道各位置像素值的平方和的均值减去所有通道所有像素值的和求平均的平方。
信息损失公式就是图像J超出0-255的各个位置、各个通道像素值的超出部分的平方和的均值,比如(0,0)位置、(R,G,B)值为(260,50,-10),则该位置超出部分值为(260-255)2+(-10)2),将图像中所有这样的像素计算出的结果全部相加然后除以像素数量(像素数量=宽高通道数)就是信息损失公式。
3. 算法流程
3.1 求取大气光
该论文求取大气光A值的方法和暗通道去雾算法不同,更加具有鲁棒性。求大气光算法主要分为以下几步:
- 将图像srcImage均分为四部分,分别为左上:ulImage,右上:urImage,右下:brImage,左下:blImage。
- 计算每部分得分,方法如下:先计算每部分每通道的均值和标准差(例如:左上部分ulImage:ulMeanR,ulMeanG,ulMeanB,ulStdR,ulStdG,ulStdB)。然后计算得分Score(例如左上部分:ulScore=(ulMeanR-ulStdR)+(ulMeanG-ulStdG)+(ulMeanB-ulStdB))。
- 将得分最高的图像部分赋给srcImage。
- 重复1-3步,直到最高得分区域面积小于预先设定值。作者代码中设置的是200。
- 取该区域最亮点的RGB值作为大气光值,方法如下min(||(R,G,B)-(255,255,255)||)。即每点distance=sqrt((255-R)2+(255-G)2+(255-B)2),distance最小的点即为最亮点。
注意:我认为该计算大气光方法的前提是假设天空区域图像亮度值较大且较为均匀,因此,各通道均值较大,而标准差较小,这样得分才会最大化。
但是实践证明此方法计算的大气光也可能存在问题,对于工业应用,一般是光源打光,没有天空部分,在镜头起雾的情况下,若图像中有较为鲜艳的颜色,我的实践图像中存在较大块明亮黄色区域(RG通道值较大,B通道值较小),其余部分为灰白色(RGB通道值相似),导致黄色区域中最亮的像素被计算为大气光值,最后去雾后,图像灰白色部分都变为暗紫色,整个图像颜色偏色严重。
因此,我认为要么找到一种更具鲁棒性的方法,要么根据自己图像的特点进行大气光值修正,我就是用的后者,由于图像大部分区域为灰白色,因此,我将计算得到的大气光RGB值中与其他两个相差较大的值修正为另外两个值的和的均值。
3.2 求粗透射率图
粗投射率的求取是一个迭代的过程:
- 先对图像分块,分块大小为30*30,每块图像的初始投射率是相同的,初始值为trans = 0.3。
- 然后对各个通道利用公式
计算出图像J。 - 计算图像J每块的对比度:对每一个图像块(width, height),其通道数为n,其像素数量为nNumofPixels = width*height*n,然后计算其每个通道、每个位置像素值的平方和fSumofSquaredOuts,然后计算每个通道、每个位置像素值的和fSumofOuts。对比度 Econtrast = -(fSumofSquaredOuts/nNumofPixels - (fSumofOuts/nNumofPixels)2)。 可以看出这不是计算的方差,本文代码利用计算方差后发现,与作者代码效果差异不大,但是在色彩艳丽部分失真比作者的代码要小一点。
计算对比度的同时计算信息损失:对每个通道、每个位置的像素值value,若超出255,则计fSumofSLoss += (value-255)2,若小于0,则计fSumofSLoss += value2。信息损失 Eloss= fSumofSLoss/nNumofPixels。 - 计算代价函数:根据引入的惩罚系数λ,代价函数fCost = λ*Eloss+Econtrast。若fCost为首次计算或非首次计算但fMinCost>fCost,则fMinCost = fCost,该图像块的transmission = trans。然后该块的trans += 0.1。
- 循环迭代2-4步,迭代次数<7。
3.3 细化透射率图
本步骤使用导向滤波实现,将原图像的灰度图作为导向图,粗投射率图像作为待滤波图像,进行导向滤波,得到细化后的透射率图像。
3.4 恢复无雾图像
利用本文最开始的无雾图像计算公式恢复出无雾图像J即可。恢复得到的无雾图像一般比原图暗,可以适当利用gamma校正等手段校正图像亮度。
4. 效果
最终去雾效果如下图:
5. 代码
作者论文和代码链接:http://mcl.korea.ac.kr/projects/dehazing/#userconsent#,论文下载要收费,可以在本文开头下载链接中下载论文。
本人代码链接:https://github.com/EthanAndEvan/DeHazeByContrastEnhance,若访问不了github,还可以在本站下载:https://download.csdn.net/download/HIVAN1/12230497
转载:https://blog.csdn.net/HIVAN1/article/details/104482772