当前位置:首页 > > FPGA开源工作室


基于暗通道先验条件图像去雾算法

香港大学何凯明博士2009发表了一篇论文《Single Image Haze Removal Using Dark Channel Prior 》。文章中,何凯明博士提出了一种简单而有效的图像先验暗通道消除单输入图像雾的算法暗通道先验是一种无雾室外图像的统计。这是基于一个关键的观察——大多数无雾室外图像的局部区域包含一些像素,这些像素在至少一个颜色通道R,G,B中的强度非常低。利用这一先验模型,可以直接估计图像中薄雾的厚度,并恢复高质量的无薄雾图像。各种室外雾霾图像的结果表明了该方法的有效性。此外,作为除雾的副产物,还可以获得高质量的深度图。

1 使用单个图像去除薄雾。

如图1所示,a输入雾度图像b除雾后的图像c深度图。

暗通道先验图像去雾计算流程:

2 暗通道先验图像去雾计算过程

1 暗通道图像

暗通道先验是基于以下对无雾室外图像的观察:在大多数非天空斑块中,至少有一个颜色通道在某些像素处的强度非常低。换句话说,这样一个窗口的最小强度值应该很低。形式上,对于图像j,定义:

其中jc是j的颜色通道,Ω(x)是以x为中心的一个局部窗口。观察表明,除了天空区域,jdark的强度较低,如果j是无雾室外图像,则趋向于零(jdark__>0)。称jdark为j的暗通道,上面的统计观测或知识为暗通道先验

2 透射率图像

透射率公式推导过程在此不再赘述,请参看《Single Image Haze Removal Using Dark Channel Prior》。

实际上,即使在晴朗的日子里,大气也不是绝对没有任何粒子的。所以,当我们看远处的物体时,雾仍然存在。此外,雾的存在是一个基本线索或人类感知深度。这种现象叫做空中透视。如果我们彻底消除图像中的雾,图像可能显得不自然,深度感可能会消失。所以可以选择通过在方程中引入一个常数参数ω(0<ω≤1),为遥远的物体保留一小部分雾:

其中t(x)为透射率,ω(0<ω≤1)为常数参数,Ω(x)是以x为中心的一个局部窗口,Ac全球大气光强度,Ic观察到的强度

3 带雾图像去雾

3 雾效果

如图3所示,(a)输入雾化图像(b)为透射率(c)Soft Matting后的精细透射图(d最终无雾图像。

典型的t0值为0.1,由于场景的亮度通常不如大气光的亮度,所以去雾后的图像看起来很暗淡。因此,增加了J(X)的曝光以达到最佳效果如图3d是最后恢复的无雾图像

4 除雾效果

如图4所示,顶部:输入模糊图像。中间:恢复无雾图像。底部:深度图。顶部行图像中的红色矩形指示的地方为自动获取大气光强的位置。

4 matlab基于暗通道先验实现图像去雾

5 实验图1

6 实验图2

7 实验图3

Matlab 源码:

clear all

close all

clc

w0=0.85; %0.65 乘积因子用来保留一些雾,1时完全去雾

t0=0.1;

I=imread('test1.jpg');

Ir = I(:,:,1);

[h,w,s]=size(I);

min_I=zeros(h,w);

dark_I = zeros(h,w);

%下面取得暗影通道图像

for i=1:h

for j=1:w

dark_I(i,j)=min(I(i,j,:));

end

end

dark_I = uint8(dark_I);

img_dark = ordfilt2(dark_I,1,ones(5,5));

Max_dark_channel=double(max(max(img_dark))) %天空亮度

dark_channel=double(img_dark);

t1=1-w0*(dark_channel/Max_dark_channel); %取得透谢分布率图

t2=max(t1,t0);

T=uint8(t1*255);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

I1=double(I);

J(:,:,1) = uint8((I1(:,:,1) - (1-t2)*Max_dark_channel)./t2);

J(:,:,2) = uint8((I1(:,:,2) - (1-t2)*Max_dark_channel)./t2);

J(:,:,3) =uint8((I1(:,:,3) - (1-t2)*Max_dark_channel)./t2);

figure,

set(gcf,'outerposition',get(0,'screensize'));

subplot(221),imshow(I),title('原始图像');

subplot(222),imshow(J),title('去雾后的图像');

subplot(223),imshow(img_dark),title('dark channnel的图形');

subplot(224),imshow(T),title('透射率t的图形');

imwrite(J,'wu1.jpg');

8 实验结果1

9 实验结果2

10 实验结果3

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
关闭