Single Image Haze Removal Using Dark Channel Prior 论文阅读与代码实现

He 提出暗通道去雾方法进行了详细的描述,该方法以大气散射模型为基础,利用暗通道先验原理求出全球大气光成分A和透射率t。先使用了软抠图对透射率图进行优化,但是运算时间过长。后来使用引导滤波精细化透射率图,缩短了一部分运算时间。

暗通道先验:

在绝大多数非天空的局部区域里,某一些像素总会有至少一个RGB颜色通道具有很低的值。换言之,该区域光强度的最小值是个很小的数,值接近于0。

实际生活中造成暗原色中低通道值主要有三个因素:

a)汽车、建筑物和城市中玻璃窗户的阴影,或者是树叶、树与岩石等自然景观的投影;

b)色彩鲜艳的物体或表面,在RGB的三个通道中有些通道的值很低(比如绿色的草地/树/植物,红色或黄色的花朵/叶子,或者蓝色的水面);

c)颜色较暗的物体或者表面,例如灰暗色的树干和石头。总之,自然景物中到处都是阴影或者彩色,这些景物的图像的暗原色总是很灰暗的。

我们给暗通道一个数学定义,对于任意的输入图像J,其暗通道可以用下式表达:

c表示图像R,G,B中的每个通道。

Jc表示彩色图像的某一通道 。

Ω(x)表示以像素X为中心的一个窗口。

 式(5)的意义用代码表达也很简单,求解过程如下:

(1)求出每个像素RGB分量中的最小值,存入一副和原始图像大小相同的灰度图中

(2)对这幅灰度图以15x15的窗口进行最小值滤波,即以每个窗口的最小值代替这个像素点的最小值。滤波的半径由窗口大小决           定(论文采用7),一般有WindowSize = 2 * Radius + 1; 

def darkChannel(src, r=15):
    
    temp = np.min(src,2)
    
    s = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (r,r))

    dst = cv2.erode(temp, s)
    
    return dst

举个栗子:

由上述几幅图像,可以明显的看到暗通道先验理论的普遍性。在作者的论文中,对5000多副无雾图像手动裁剪掉天空区域,重调整图片大小,使得图片长宽不大于500,Ω(x)的大小选取15*15,发现75%的暗通道的像素值都为0,90%的暗通道的像素值都低于25,很好验证暗通道理论的普适性,因此,我们可以认为其实一条定理。

 

大气散射模型(求解A与t(x)):

在计算机视觉和计算机图形中,下述方程所描述的雾图形成模型被广泛使用:

I(X)就是我们现在已经有的图像(待去雾的图像)。

J(x)是我们要恢复的无雾的图像。

A是全球大气光成分, t(x)为透射率。

将式(1)稍作处理,变形为下式(C表示R/G/B三个通道的意思):

首先假设在每一个窗口内透射率t(x)为常数,也就是假设在同一窗口的上的透射率是相同的,定义他为,且A值已经给定,然后对式(7)两边求两次最小值运算得到下式:

上式中,J是待求的无雾的图像,根据前述的暗原色先验理论有:

可推导出:

把式(10)带入式(8)中,得到:

这里使用guideFilter引导滤波,优化已经求得的通道图片,所以上式变为t=1-V/A,这里V为透射率图。

引导图应该与原图尽可能相似,取np.min(src,2)

也就是:V = guideFilter(np.min(m,2) , dc, r, eps),这里应该在[0,1]范围内进行,也就是引导图和预估的投射图都必须从[0,255]->[0,1]进行计算。导向滤波的r值应当不小于进行最小值滤波半径r的4倍

即使是晴天白云,空气中也存在着一些颗粒,因此,看远处的物体还是能感觉到雾的影响,另外,雾的存在让人类感到景深的存在,因此,有必要在去雾的时候保留一定程度的雾,这可以通过在式(11)中引入一个在[0,1] 之间的因子,则式(11)修正为:

注:文中所有的测试结果依赖于:  ω=0.95

上述推论中都是假设全球达气光A值时已知的,在实际中,我们可以借助于暗通道图来从有雾图像中获取该值。具体步骤如下:

(1) 从暗通道图中按照亮度的大小取前0.1%的像素。(经过导向滤波这应为投射率图)

(2)在这些位置中,在原始有雾图像I中寻找对应的具有最高亮度的点的值,作为A值。

使用累计灰度直方图来实现求A值

bins = 256  
hist = np.histogram(V, bins)                  #灰度直方图

这里V是待统计数据数组,bins为等分数。返回值有两个:

hist[0]:hist:array,返回数组V中的数据在每个等分区间的个数。

hist[1]:bin_degs,长度为len(hist)+1,为分组的边界。(bin_degs[0], bin_edgs[1])=hist[0]

normHist = hist[0]/float(V.size)              #归一化灰度直方图

概率直方图,灰度值k的像素点个数占的图比例

accumulativeHist = np.cumsum(normHist)    #累计直方图

代表图像组成成分在灰度级的累计概率分布情况,每一个概率值代表小于等于此灰度值的概率。

for k in range(bins-1, 0, -1):
        
        if accumulativeHist[k]<=0.999:             #取前0.1%的像素,并获得该位置k
            break 
        
A  = np.mean(m,2)[V>=hist[1][k]].max()        #在原始有雾的图像I中寻找对应的具有最高亮度的点的值

这里返回的k值就是边界值k。

到这一步,我们就可以进行无雾图像的恢复了。由式(1)可知:  J = ( I - A)/t + A  

现在I,A,t都已经求得了,因此,完全可以进行J的计算。

当投射图t 的值很小时,会导致J的值偏大,从而使淂图像整体向白场过度,因此一般可设置一阈值T0,当t值小于T0时,令t=T0,本文中所有效果图均以T0=0.1为标准计算。

因此,最终的恢复公式如下:

实验结果对比:

 

### 回答1: 单图像去雾是一种常见的计算机视觉问题,它旨在从含有雾霾的图像中恢复出清晰的图像。"Dark Channel Prior"是一种常用的算法,在单图像去雾中有着广泛的应用。 Dark Channel Prior(暗通道先验)是通过观察自然景物在局部区域中深度最小像素的强度来估计雾霾浓度和传播距离的先验知识。Dark Channel可以简单地通过在输入图像的每个像素位置上采用最小值操作来计算得到。这样,我们可以仿佛窥视很多景物的背后,包括雾霾中那些没有雾的真实景物。 Dark Channel Prior算法分为三个步骤: 1. 估计暗通道:对输入图像的每个像素计算出最小通道值,得到每个像素位置的暗通道。由于雾霾导致图像亮度改变,这一步估计了景物中的最小透射率。 2. 估计大气光:通过在暗通道图像中找到最亮的像素值,得到估计的大气光。这是因为大气光对于雾霾图像中的亮度改变有关键作用。 3. 去雾恢复:基于估计的暗通道和大气光,我们可以在图像中进行退化模型的恢复,以消除雾霾效应。这可以通过以下公式实现:R = (I - A) / t + A,其中R是去雾后的图像,I是输入图像,A是估计的大气光,t是透射率。 代码实现上,我们可以通过使用基于块的方法来减小计算量,同时在去雾后对结果进行细化和增强,以获得更好的效果。在此基础上,还可以采用其他技术和方法来进一步改进去雾结果,例如引入图像边缘信息和增加颜色校正。 总之,单图像去雾是一项具有挑战性和广泛应用的任务。"Dark Channel Prior" 算法被证明是一种有效的方法,能够在一定程度上还原出清晰的图像,提升雾霾图像的质量。 ### 回答2: Single image haze removal using dark channel prior是一种用于去除图片中雾霾的算法。该算法通过分析图像的暗通道先验信息来估计图像中的雾霾程度,并进行相应的去雾操作。 暗通道先验是指图像中的某些区域在某个颜色通道上的像素值较低。这是因为雾霾会使得图像中的物体颜色变浅,而远处的物体通常更加受到雾霾的影响。基于此,算法通过寻找图像中的暗通道来估计雾霾强度。 具体实现方案如下: 1. 对于给定的输入图像,算法首先计算图像的暗通道。这可以通过对图像的每个像素点在RGB颜色空间中选择最小值来实现。 2. 通过暗通道估计得到的雾霾强度,算法可以计算出每个像素点在雾霾下的透射率。透射率越高,表示该像素受到的雾霾影响越小。 3. 基于透射率,算法可以计算出未被雾霾遮挡的场景亮度。这可以通过选择图像中的最大值来实现。 4. 最后,算法通过去除透射率和场景亮度对图像进行去雾操作。这可以通过对每个像素点应用去雾公式来实现。去雾公式将图像中的像素值重新映射,以减少雾霾的影响。 通过单一图像和暗通道先验的使用,该算法能够较好地去除图像中的雾霾,提高图像的可视性和质量。它在计算机视觉和图像处理领域有着广泛的应用,例如景观摄影和无人驾驶等。 ### 回答3: Single image haze removal using dark channel prior是一种用于去除图像雾霾的算法。这个算法的代码实现逻辑是基于一个称为“暗通道先验”的概念。 在这个算法中,我们首先计算图像的暗通道图像。暗通道图像是指在图像的每个局部区域内,选择像素值最小的通道作为该区域的暗通道像素值。通过计算暗通道图像,我们可以得到整个图像的暗通道图像。 接下来,通过观察我们发现,大部分的非天空区域的暗通道像素值都是接近于0的,而天空区域的暗通道像素值通常会高于0。而这些高于0的像素值正是由于雾霾所导致的。 因此,我们可以通过选取每个局部区域内暗通道像素值最小的像素点作为参考点,来估算出雾霾的浓度。进一步地,我们可以根据这个浓度值来消除图像的雾霾。 具体地,我们可以使用以下公式来计算去除雾霾后的像素值: t(x) = 1 - w * min(R/G, R/B) 其中,t(x)表示去除雾霾后的像素值,w表示雾霾浓度(衡量雾霾的程度),R/G和R/B分别表示图像红色通道和绿色通道以及蓝色通道的比值。这个公式可以将原始像素值转换为去除雾霾后的像素值。 最后,我们可以根据去除雾霾后的像素值和原始图像的亮度值来还原最终的去雾图像。 Single image haze removal using dark channel prior代码实现了上述算法的具体步骤和细节。通过使用这个代码,我们可以方便地对图像进行去雾处理,使得图像更加清晰和真实。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值