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

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

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

matlab求图像暗通道图像,基于暗通道先验条件图像去雾算法_第1张图片

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

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

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

matlab求图像暗通道图像,基于暗通道先验条件图像去雾算法_第2张图片

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

1 暗通道图像

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

8fe47021995a9aa883ffd76aaacdfd67.png

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

2 透射率图像

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

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

0ef9cb59923c33c730637458348432b3.png

其中t(x)为透射率,ω(0

3 带雾图像去雾

matlab求图像暗通道图像,基于暗通道先验条件图像去雾算法_第3张图片

图3 去雾效果

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

5f63d8af9f0baf7e2264c659250c43f0.png

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

matlab求图像暗通道图像,基于暗通道先验条件图像去雾算法_第4张图片

图4除雾效果

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

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

matlab求图像暗通道图像,基于暗通道先验条件图像去雾算法_第5张图片

图5 实验图1

matlab求图像暗通道图像,基于暗通道先验条件图像去雾算法_第6张图片

图6 实验图2

matlab求图像暗通道图像,基于暗通道先验条件图像去雾算法_第7张图片

图7 实验图3

Matlab 源码:

clearall

closeall

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);

%下面取得暗影通道图像

fori=1:h

forj=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');

matlab求图像暗通道图像,基于暗通道先验条件图像去雾算法_第8张图片

图8 实验结果1

matlab求图像暗通道图像,基于暗通道先验条件图像去雾算法_第9张图片

图9 实验结果2

matlab求图像暗通道图像,基于暗通道先验条件图像去雾算法_第10张图片

图10 实验结果3

公众号回复"defog"获取何凯明博士论文,matlab和opencv源码。

图像处理往期

更多精彩推荐,请关注我们

万水千山总是情,点个 “好看” 行不行!!!

a5e7d676128987f84024721468253e23.png

你可能感兴趣的:(matlab求图像暗通道图像)