基于偏振差分成像的图像去雾算法


Polarization-based vision through haze

Yoav Y.Schechner,Srinivasa G.Narasimhan,and Shree K.Nayar

Columbia University

1,介绍

这篇文章在分析图像形成的过程中,将偏振对大气散射的影响考虑在内,然后设计从图像中去雾的算法。这个方法可以通过旋转偏振片到不同的角度或者两张偏振图像来实现。这个方法效果很好,不需要依赖天气情况的变化。

2,基本原理

把从光源到分布粒子的光线和从分布粒子到相机的光线构成的平面作为标准平面。将一束光线分成两个偏振分量,平行的量和垂直的量。光线和此平面平行的偏振量为,光线和此平面垂直的偏振量为,可以定义偏振度为:

 

其中A定义为: 

 

根据大气散射模型,直接传输定义为:

 

其中表示无雾图像,t(z)可以表达为:

 

从而没有经过偏振片的含雾图像可以表达为:

 

当旋转偏振片时,是随偏振角度变化的函数,其函数曲线如下:

由上图可见,当偏振角度为90度时,为“最坏的状态”。当偏振角度为0度时,为“最好的状态”。其表达式如下:

 

 

其中通过反解上式可得:

 

 

3,去雾过程

   首先,应该求得大气光值和其对应的偏振度p。实验中,采取手动估计的方法,即手动选取两幅正交偏振图像的同一区域,计算该区域的每一个像素处的大气光值和对应偏振度的值,然后取这些计算值的平均值,即可得到大气光值和偏振度值。

   现在定义每一个像素点的大气光为:

 

无偏振图像为:

 

传输函数为:

 

由以上各式,得到去雾图像为:

 

4,实现过程

     依据上述的理论过程,利用MATLAB实现其算法如下(代码中用到了guidedfiter函数,即导向滤波,可自行寻找其代码,此处省略):

clear all;
Iper=imread('E:\yy\code\ImageWorst_tiff16.tiff');
Ipar=imread('E:\yy\code\ImageBest_tiff16.tiff');

N=255*255;
Ipar=double(Ipar)/N;Iper=double(Iper)/N;
Itotal=Ipar+Iper;

[m,n,o]=size(Ipar);

[Ipar_infi,rect1]=imcrop(Ipar);
Iper_infi=imcrop(Iper,rect1);

Pr=(sum(sum(Iper_infi(:,:,1)))-sum(sum(Ipar_infi(:,:,1))))/(sum(sum(Iper_infi(:,:,1)))+sum(sum(Ipar_infi(:,:,1))));
Pg=(sum(sum(Iper_infi(:,:,2)))-sum(sum(Ipar_infi(:,:,2))))/(sum(sum(Iper_infi(:,:,2)))+sum(sum(Ipar_infi(:,:,2))));
Pb=(sum(sum(Iper_infi(:,:,3)))-sum(sum(Ipar_infi(:,:,3))))/(sum(sum(Iper_infi(:,:,3)))+sum(sum(Ipar_infi(:,:,3))));

P=zeros(1,3);P(1)=Pr;P(2)=Pg;P(3)=Pb;
A=zeros(m,n,o);R=zeros(m,n,o);
for k=1:3
    A(:,:,k)=(Iper(:,:,k)-Ipar(:,:,k))/P(k);
end

x=A(:,:,1);y=A(:,:,2);z=A(:,:,3);

Ainf=zeros(1,3);
[m1,n1,o1]=size(Ipar_infi);
Ainfr=(sum(sum(Iper_infi(:,:,1)))+sum(sum(Ipar_infi(:,:,1))))/(m1*n1);
Ainfg=(sum(sum(Iper_infi(:,:,2)))+sum(sum(Ipar_infi(:,:,2))))/(m1*n1);
Ainfb=(sum(sum(Iper_infi(:,:,3)))+sum(sum(Ipar_infi(:,:,3))))/(m1*n1);

Ainf(1)=Ainfr;Ainf(2)=Ainfg;Ainf(3)=Ainfb;

t=zeros(m,n,o);
for k=1:3
    t(:,:,k)=max(1-(A(:,:,k)/Ainf(k)),0.1);
end

r=60;eps=10^-6;
for k=1:3
    t(:,:,k)=guidedfilter(Itotal,t(:,:,k),r,eps);
end

for k=1:3
    R(:,:,k)=(Itotal(:,:,k)-A(:,:,k))./(t(:,:,k));
end

imshow(R);
imwrite(R,'E:\yy\code\R.png');

5,实验结果

     0度偏振图像和90度偏振图像分别为:

                                               

其复原结果如下:

                                                                                                      

     可以看到,复原结果中的天空区域出现了大量的噪声,作者的其余几篇文章中有介绍去噪的方法,可是其算法的公式太过复杂,不管你会不会,我反正是不会了,希望有能力的大佬对复原结果作进一步的去噪处理,得出更好的复原结果。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM