天天看點

圖像的陰影檢測消除和圖像重建算法matlab仿真

目錄

​​一、理論基礎​​

​​二、核心程式​​

​​三、仿真測試結果​​

作者ID  :fpga和matlab

擅長技術:
1.無線基帶,無線圖傳,編解碼 
2.機器視覺,圖像處理,三維重建 
3.人工智能,深度學習 
4.智能控制,智能優化
5.其他      

一、理論基礎

       陰影是自然界中普遍存在的一種實體現象,圖像中陰影的存在會對物體識别、目标追蹤等計算機視覺的相關問題造成不利的影響,是以研究圖像中陰影的檢測和去除算法是十分必要的。當一個光源的光線由于其他物體的阻擋不能夠達到一個物體的表面的時候,那麼這個物體就在陰影中了。陰影能夠使場景看起來真實得多,并且可以讓觀察者獲得物體之間的空間位置關系。陰影對于真實感場景繪制具有重要的意義,不僅能夠反映空間中物體之間的互相遮擋關系,也能反映遮擋物以及接收表面的幾何資訊,陰影的實時繪制還大大增加了場景繪制的真實度,陰影繪制技術主要有陰影圖算法和陰影體算法兩類,與陰影體算法相比,陰影圖算法具有與場景複雜度無關、易于實作以及受圖形硬體支援等優點,它在業界得到了更廣泛的應用。

        陰影作為圖像退化的一種特殊形式,其存在會對機器視覺圖像的資訊造成一定的損失或幹擾,這在計算機圖像處理過程中将直接導緻相應區域的邊緣提取、目辨別别以及影像比對等算法的結果不穩定甚至失敗。靜态圖像中的陰影處理一直是一個比較困難的問題,在分析了陰影的成因和光譜屬性的基礎上,對靜态圖像中的陰影檢測和陰影去除算法進行了研究。陰影檢測是陰影處理算法的基礎,陰影檢測算法的準确性直接影響之後陰影去除算法的效果。本文首先總結概括了現有的幾種陰影檢測算法,并對它們進行了詳細的優缺點分析。最近的研究表明,對立色彩空間中的紅-綠通道與陰影具有最大的無關性。

        陰影雖能為圖像深度和物體幾何形狀預估等計算機視覺研究工作提供重要依據,但其存在也會加大物體檢測、目标跟蹤等任務的難度。陰影去除常包含陰影定位和去陰影這兩個步驟。在陰影定位過程中,文獻[1-3]中使用陰影檢測的方法:

[1]GUO R, DAI Q, HOIEM D. Paired regions for shadow detection and removal [J]. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2013, 35(12): 2956-2967.

[2]KHAN S H, BENNAMOUN M, SOHEL F, et al. Automatic shadow detection and removal from a single image [J]. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2016, 38(3): 431-446.doi:10.1109/TPAMI.2015.2462355.

[3]張營,朱岱寅,俞翔,等.一種VideoSAR動目标陰影檢測方法[J].電子與資訊學報,2017,39(9):2197-2202. doi: 10.11999/JEIT161394.ZHANG Ying, ZHU Daiyin, YU Xiang, et al.. Approach to moving targets shadow detection for VideoSAR[J]. Jounal of Electronics & Information Technology, 2017, 39(9): 2197-2202. doi: 10.11999/JEIT161394.      

文獻[4]中的深度網絡能夠學習陰影檢測所需要的特征,但受到資料集規模的限制,這兩個網絡層次都較淺。

[4]SHEN L, CHUA T W, LEMAN K. Shadow optimization from structured deep edge detection [C]// Proceedings of the 2015 IEEE Conference on Computer Vision and Pattern Recognition. Piscataway, NJ: IEEE, 2015: 2067-2074.doi:10.1109/CVPR.2015.7298818.      

       文獻[5-6]中通過比較光照不變圖和原始RGB圖像進行陰影檢測,然後提出一系列基于梯度的方法進行陰影去除。但這些基于梯度的方法僅僅隻改變陰影邊界或半陰影區域的梯度變量,是以對于全陰影區域的光照變量并不适用。

[5]FINLAYSON G D, HORDLEY S D, DREW M S. Removing shadows from images [C]// Proceedings of the 2002 European Conference on Computer Vision, LNCS 2353. Berlin: Springer, 2002: 823-836.doi:10.1007/3-540-47979-1_55.

[6]FINLAYSON G D, HORDLEY S D, LU C, et al. On the removal of shadows from images [J]. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2006, 28(1): 59-68.doi:10.1109/TPAMI.2006.18.      

       圖像中的陰影會對計算機視覺圖像資訊産生幹擾,引起圖像品質下降,并導緻物體分割,目辨別别及追蹤等處理結果不穩定甚至失敗,嚴重影響了計算機視覺圖像處理算法的性能. 首先,以光度學和色度學的相關理論為基礎,介紹了光源模型,光反射模型和成像模型的建立方法,以及幾種常用的顔色模型,并在此基礎上分析了陰影的成因及性質. 在陰影檢測算法研究中,首先,研究了兩種陰影檢測算法,介紹了它們的工作原理和實作方法,并分析了其優缺點.這兩種檢測方法分别以光照無關圖和顔色特征不變性為基礎,并且均建立于人眼視覺系統的三色學說基礎上.與同表面非陰影區域相比,圖像中陰影區域一般會具有以下特征:其亮度會明顯比非陰影區域低;與非陰影區域有分界,界線寬度一般不大,在界線上存在漸變;陰影區域的顔色通道比例和非陰影區域比較接近。我們可以利用這些特征來完成陰影檢測的工作。

        在白天的戶外環境中,主要存在兩種光源:太陽光的直射,和天空的光線散射。非陰影區域同時受到了太陽光的直射和天空的光線散射,而陰影區域則沒有太陽光的直射,隻存在天空的光線散射。顯然,太陽光的直射強度要大大高于天空的光線散射強度。對于陰影區域,它和陽光直射區域的差即為太陽直射的顔色分布。如果能夠将太陽直射下顔色在三個通道的構成比例計算出來的話就可以很好的輔助進行陰影檢測。

對于陰影檢測:

圖像的陰影檢測消除和圖像重建算法matlab仿真

通過上述公式,可以将影子的區域及邊緣進行有效的提取。删除陰影時,有注意。由于圖像是灰階圖像,如果圖像背景較淺且對象較暗,則必須先執行最大濾波,然後再執行最小濾波。如果圖像背景較暗且物體較亮,我們可以先執行最小濾波,然後再進行最大濾波。

 對于陰影消除:

圖像的陰影檢測消除和圖像重建算法matlab仿真
圖像的陰影檢測消除和圖像重建算法matlab仿真

通過上述過程,我們可以完成陰影區域的像素重建,繼而完成圖像的恢複。圖像複原技術的主要目的是以預先确定的目标來改善圖像,大部分是一個客觀的過程。圖像複原試圖利用退化現象的某種先驗知識來複原被退化的圖像。因而,複原技術是面向退化模型的,并且采用相反的過程進行處理,以便恢複出原圖像。

以上,我參考的文獻:

圖像的陰影檢測消除和圖像重建算法matlab仿真

二、核心程式

%%
%圖像恢複
for i = 1:r
    for j = 1:c
        if BW(i,j) == 1   
           Io3(i,j,1) = 0;
           Io3(i,j,2) = 0;
           Io3(i,j,3) = 255;
        else
           Io3(i,j,1) = I(i,j,1);
           Io3(i,j,2) = I(i,j,2);
           Io3(i,j,3) = I(i,j,3);
        end
    end
end
figure(2);
imshow(Io3);title('陰影邊緣檢測效果');


%計算陰影邊界例外L個像素點的像素變換

%計算I_modelled
L   = 7;%陰影變換過度區間 
ind = 0;
hL  = (L-1)/2;

for i = hL+2:r-hL-2
    for j = hL+2:c-hL-2
        if Io(i,j) == 255 
               if (BW(i,j) == 1 & BW(i,j-1) == 0 & BW(i,j-2) == 0 & BW(i,j-3) == 0 & BW(i,j+1) == 0 & BW(i,j+2) == 0 & BW(i,j+3) == 0 )
                  ind = ind + 1; 
                  for n = L:-1:1  
                  
                  I_min1{ind} = min(min(I(i,j-hL:j+hL,1)));
                  I_min2{ind} = min(min(I(i,j-hL:j+hL,2)));
                  I_min3{ind} = min(min(I(i,j-hL:j+hL,3)));

                  I_max1{ind} = max(max(I(i,j-hL:j+hL,1)));
                  I_max2{ind} = max(max(I(i,j-hL:j+hL,1)));
                  I_max3{ind} = max(max(I(i,j-hL:j+hL,1)));

                  I_modelled1{ind}(n) = I_min1{ind} + (1/(1 + exp(-(12*n - 6*L - 6)/(L - 1))))*(I_max1{ind} - I_min1{ind});
                  I_modelled2{ind}(n) = I_min2{ind} + (1/(1 + exp(-(12*n - 6*L - 6)/(L - 1))))*(I_max2{ind} - I_min2{ind});
                  I_modelled3{ind}(n) = I_min3{ind} + (1/(1 + exp(-(12*n - 6*L - 6)/(L - 1))))*(I_max3{ind} - I_min3{ind});
                  
                  I01{ind}  = I(i,j+hL-1:-1:j-hL-1,1);
                  I02{ind}  = I(i,j+hL-1:-1:j-hL-1,2);
                  I03{ind}  = I(i,j+hL-1:-1:j-hL-1,3);
                  end
               end
         
               if (BW(i,j) == 1 & BW(i-1,j) == 0 & BW(i-2,j) == 0 & BW(i-3,j) == 0 & BW(i+1,j) == 0 & BW(i+2,j) == 0 & BW(i+3,j) == 0 )
                  ind = ind + 1;
                  for n = L:-1:1   
                   
                  I_min1{ind} = min(min(I(i-hL:i+hL,j,1)));
                  I_min2{ind} = min(min(I(i-hL:i+hL,j,2)));
                  I_min3{ind} = min(min(I(i-hL:i+hL,j,3)));

                  I_max1{ind} = max(max(I(i-hL:i+hL,j,1)));
                  I_max2{ind} = max(max(I(i-hL:i+hL,j,1)));
                  I_max3{ind} = max(max(I(i-hL:i+hL,j,1)));

                  I_modelled1{ind}(n) = I_min1{ind} + (1/(1 + exp(-(12*n - 6*L - 6)/(L - 1))))*(I_max1{ind} - I_min1{ind});
                  I_modelled2{ind}(n) = I_min2{ind} + (1/(1 + exp(-(12*n - 6*L - 6)/(L - 1))))*(I_max2{ind} - I_min2{ind});
                  I_modelled3{ind}(n) = I_min3{ind} + (1/(1 + exp(-(12*n - 6*L - 6)/(L - 1))))*(I_max3{ind} - I_min3{ind});
                  
                  I01{ind}  = I(i+hL-1:-1:i-hL-1,j,1);
                  I02{ind}  = I(i+hL-1:-1:i-hL-1,j,2);
                  I03{ind}  = I(i+hL-1:-1:i-hL-1,j,3);
                  end
               end
 
           
        end
    end
end
 
%計算I_Restored
I_Restored = I;
ind        = 0;

for i = hL+2:r-hL-2
    for j = hL+2:c-hL-2
        if Io(i,j) == 255  

               if (BW(i,j) == 1 & BW(i,j-1) == 0 & BW(i,j-2) == 0 & BW(i,j-3) == 0 & BW(i,j+1) == 0 & BW(i,j+2) == 0 & BW(i,j+3) == 0 ) 
                  ind         = ind + 1;
                  for n = L:-1:1 
                  I_Restored1{ind}(n) =  I_max1{ind} * (double(I01{ind}(n))/double(I_modelled1{ind}(n)));
                  I_Restored2{ind}(n) =  I_max2{ind} * (double(I02{ind}(n))/double(I_modelled2{ind}(n)));
                  I_Restored3{ind}(n) =  I_max3{ind} * (double(I03{ind}(n))/double(I_modelled3{ind}(n)));  
                  end
               end
 
               if (BW(i,j) == 1 & BW(i-1,j) == 0 & BW(i-2,j) == 0 & BW(i-3,j) == 0 & BW(i+1,j) == 0 & BW(i+2,j) == 0 & BW(i+3,j) == 0 )
                  ind         = ind + 1;
                  for n = L:-1:1 
                  I_Restored1{ind}(n) =  I_max1{ind} * (double(I01{ind}(n))/double(I_modelled1{ind}(n)));
                  I_Restored2{ind}(n) =  I_max2{ind} * (double(I02{ind}(n))/double(I_modelled2{ind}(n)));
                  I_Restored3{ind}(n) =  I_max3{ind} * (double(I03{ind}(n))/double(I_modelled3{ind}(n)));  
                  end
               end
        end          
    end    
end





S  = zeros(r,c,3);
NS = zeros(r,c,3); 
%顯示最後的恢複效果
ind        = 0;
Num_s      = 0;
Num_ns     = 0;
for i = 1:r
    for j = 1:c
        if Io(i,j) == 255
           S(i,j,1)  = I(i,j,1);  
           S(i,j,2)  = I(i,j,2);  
           S(i,j,3)  = I(i,j,3);  
           NS(i,j,1) = 0;  
           NS(i,j,2) = 0;  
           NS(i,j,3) = 0;  
           Num_s     = Num_s + 1;
        else
           S(i,j,1)  = 0;  
           S(i,j,2)  = 0;  
           S(i,j,3)  = 0;  
           NS(i,j,1) = I(i,j,1);  
           NS(i,j,2) = I(i,j,2);  
           NS(i,j,3) = I(i,j,3);       
           Num_ns    = Num_ns + 1;
        end
    end    
end


       

三、仿真測試結果

·測試圖檔1的仿真結果如下所示:

圖像的陰影檢測消除和圖像重建算法matlab仿真
圖像的陰影檢測消除和圖像重建算法matlab仿真
圖像的陰影檢測消除和圖像重建算法matlab仿真
圖像的陰影檢測消除和圖像重建算法matlab仿真

從上面的仿真可以看到,塔的影子基本被消除,并且在原來影子的地方,恢複出了原來的顔色。

·測試圖檔2的仿真結果如下所示:

圖像的陰影檢測消除和圖像重建算法matlab仿真
圖像的陰影檢測消除和圖像重建算法matlab仿真
圖像的陰影檢測消除和圖像重建算法matlab仿真

從上面的仿真可以看到,馬路的影子基本被消除,并且在原來影子的地方,恢複出了原來的路面的顔色。

·測試圖檔3的仿真結果如下所示:

圖像的陰影檢測消除和圖像重建算法matlab仿真
圖像的陰影檢測消除和圖像重建算法matlab仿真

繼續閱讀