基於偏振差分成像的圖像去霧算法


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