暗原色先验去雾算法的一些认识
摘要:本文首先简单介绍基于暗原色先验去雾算法,然后总结出各变量的求解,最后利用已知程序检验算法的效果。
引言:在雾天时,由于空气中大量悬浮粒子的散射和吸收作用,使得光学成像对比度降低,颜色偏灰白色,严重影响视觉效果,这直接限制室外各种视觉系统的作用。因此对图像去雾有着重要的现实意义。暗原色先验是基于户外无雾图像数据库得到的一条简单有效的图像先验规律。该理论的核心是:绝大多数户外无雾图像的每个局部区域里,至少存在一个颜色通道的强度值很低。称之为在暗像素。雾天中,这些暗像素会因为雾光的充斥而强度值变大。因此这些暗像素能够用来评估雾光的透射情况。根据McCarney的大气散射模型,根据光在雾天传输的物理特性可以得到较好的去雾原像。
- 雾天图像去雾模型
McCarney的大气散射模型(如下)被广泛应用于计算机视觉和图形学领域中
(1)
I是输入图像(观测到的)光强度,t指光线透射率,A是大气光成分,J是无雾时景物的光线强度。图像去雾目标就是由已知的I求得未知参数J,A,t。由于方程的个数少于未知量的个数,需增加约束条件来求解。暗原色先验即是其中的一种约束。
2.暗原色先验
暗原色先验是基于大量户外无雾图像观察到的一条统计规律:在绝大数户外无雾图像的每个局部区域至少存在某个颜色通道的强度值很低。对户外无雾图像
进行分块,对每个像素块定义暗原色如下:
(2)
式中:
是以
为中心的正方形邻域,
为
三原色的一个通道,
即为图像
在这个邻域的暗原色。观察统计表明
趋于零。在带雾图像中,这些暗原色的值会升高。
3.模型求解
对于
的估计需要以下的假设:每一个像素块的光线透射率是相同的。因此像素块的大小直接影响透射率的估计。像素块较小则
的细节多,层次感好。但会增加运算量,且可能增加局部错误;快较多时,得到的暗原色图分布会很单一,图片的层次感不明显,会使对比度下降。因此分块时可尝试不同的值,以期得到较好的值。假设大气光
已知(事实上
的估计不需要
),首先在模型(1)两端在每个像素块求取最小值:
(3)
根据暗原色先验无雾图像的暗原色趋于零,故由上式可得
(4)
而右式第二项即为带雾图像在
邻域的暗原色值,这是可以通过matlab得到的,因此局部区域的
值可以求得。从而可以得到整幅图的透射率
。但当
趋于零时,图像趋于包含噪音,因此常常需要设置一个透射率下限
(通常设置为0.1) 。
大气光的估计:在一般的单一图像去雾中,通常整幅图最大强度的像素作为大气光的估测。
最后得到
的求解公式为
(5)
4.实验结果与分析
利用已知的程序来验证算法的有效性,可以看到原本模糊的图像经处理后变得更加清晰,色彩更鲜明,视觉上感觉更舒适。
总结:暗原色先验使得单一图像去雾变得简洁且有效。但由于本身是一条统计规律,因此在某些极端情况下(如全白色的图景)效果就会受到很大的影响。在实际应用中,暗原色先验原理还可以推广到音影材料的去噪中等等,这都可以进一步探索。
参考文献:
[1].He Kai-Ming,SUN JIAN,TANG Xiao-ou.Single image haze removed using dark channel prior[A].Proceedings of IEEE Conference on computer Vision and Pattern Recognition[C].Mami,2009,1956-1963.
[2]嵇晓强,戴明,孙丽娜,郎小龙,王洪.暗原色先验图像去雾算法研究.光电子,1005-0086(2011)06-0926-05
[3].胡伟,袁国栋,董朝,疏学明.基于暗通道优先的单幅去雾新方法.计算机研究与发展,2010
附录:(已知程序)
close all
clear all
clc
blockSize=8; %每个block为8个像素
w0=0.6;
t0=0.1;
% A=200;
I=imread('C:\Users\asus\Desktop\图片17.jpg');
h = figure;
subplot(321)
imshow(I);
title('Original Image');
subplot(323);
grayI=rgb2gray(I);
imshow(grayI,[]);
title('原图像灰度图') %原图像的灰度图
subplot(324);
imhist(grayI,64);
%统计<50的像素所占的比例
[COUNT x]=imhist(grayI);
under_50=0;
for i=0:50
under_50under_50=under_50+COUNT(x==i);
end
under_50
total=size(I,1)*size(I,2)*size(I,3);
percent=under_50/total
%%%%%%%%%%%%%%%%%%%
if(percent>0.02)
error('This image need not Haze-Free-Proprocessing.');
else if(percent<0.001)
w=0.6;
else if (percent>0.01)
w=0.3;
else
w=0.45;
end
end
end
[h,w,s]=size(I);
min_I=zeros(h,w);
for i=1:h
for j=1:w
dark_I(i,j)=min(I(i,j,:));%取每个点的像素为RGB分量中最低的那个通道的值
end
end
Max_dark_channel=double(max(max(dark_I)))
dark_channel=double(dark_I);
t=1-w0*(dark_channel/Max_dark_channel);
T=uint8(t*255);
t=max(t,t0);
%%%%%%%%%%%%%%%%%%%%
I1=double(I);
J(:,:,1) = uint8((I1(:,:,1) - (1-t)*Max_dark_channel)./t);
J(:,:,2) = uint8((I1(:,:,2) - (1-t)*Max_dark_channel)./t);
J(:,:,3) =uint8((I1(:,:,3) - (1-t)*Max_dark_channel)./t);
subplot(322)
imshow(J);
imwrite(J,'tj2.jpg');
title('Haze-Free Image:');
subplot(325);
grayJ=rgb2gray(J);
imshow(grayJ,[]);
title('去雾后灰度图')