引導圖濾波(Guided Image Filtering)原理以及OpenCV實現


引導圖濾波器是一種自適應權重濾波器,能夠在平滑圖像的同時起到保持邊界的作用,具體公式推導請查閱原文獻《Guided Image Filtering》以及matlab源碼:http://kaiminghe.com/eccv10/index.html。這里只說一下自適應權重原理、C++實現灰度圖像以及彩色圖像的引導圖濾波、驗證結果。

  • 自適應權重原理

     引導圖濾波作為一種線性濾波器,可以簡單定義為如下形式:

    其中I是引導圖像(guided Image),P是輸入的待濾波圖像,Q是濾波后的輸出圖像,W是根據引導圖I確定的權重值。權重值W可以用下式表示(原文獻有詳細推導):

            μk是窗口內像素點的均值,IiIj指相鄰兩個像素點的值,σk代表窗口內像素點的方差,ε是一個懲罰值。自適應權重可以根據上式分析得到:Ii和Ij在邊界兩側時,(Ii-μk)(Ij-μk)異號,否則,則同號。而異號時的權重值將遠遠小於同號時的權重值,這樣處於平坦區域的像素則會被加以較大的權重,平滑效果效果更明顯,而處於邊界兩側的像素則會被加以較小的權重,平滑效果較弱,能夠起到保持邊界的效果。
          懲罰值ε對濾波效果影響也很大,當ε值很小時,濾波如前面所述;當ε值很大時,權重的計算公式將近似為一個均值濾波器,平滑效果會更明顯。
         

    同樣也可以根據線性濾波公式來看引導圖濾波的自適應權重原理,局部線性濾波模型公式如下:

          I指引導圖像,Q是輸出圖像,akbk兩個系數根據引導圖I和輸入圖像P共同決定。將上式兩邊求梯度,可以得到▽q=a*▽I,輸出圖像的梯度信息完全由引導圖像的梯度信息決定,當引導圖中有邊界時,輸出圖像中對應位置也會有邊界。而a和b的值將會決定梯度信息和平滑信息的權重大小。
          通過觀察a和b的公式,a的分子為I和P的協方差,分母部分為I的方差加上截斷值ε;b的值為P的均值減去a乘以I的均值。可以看出當a值很小時,b約等於窗口內像素點的均值pk,近似於均值濾波;而當a值很大時,輸出則主要取決於a*▽I的大小,梯度信息能夠得到保留。

  • C++實現灰度圖像以及彩色圖像的引導圖濾波
    根據原文獻中提供的偽代碼,不難用C++實現引導圖濾波算法。偽代碼如下:



    這里需要分兩種情況,1.引導圖為單通道的灰度圖;2.引導圖為三通道的彩色圖。
  1. 引導圖為單通道
    分別算出I與P的均值圖像,以及I²和I*P的均值圖像;再求出I的方差圖像,以及I*P的協方差圖像;利用公式求出a和b的值;再窗口內對a和b求均值;再根據公式算出輸出圖像。
    這里又分為兩種情況:
    ①輸入圖為單通道:按照上述步驟計算即可。
    ②輸入圖為三通道:先分離三個通道,對每個通道進行上述濾波操作,然后合並通道即可。
  2. 引導圖為三通道
    此時,將上述模型做了稍微修改,如下:

    不同之處在於求a時將原來的方差σ替換為協方差3x3矩陣∑k,表示如下:

    U是3x3單位矩陣,求出來的a將不再是一個值,而是一個1*3的向量,然后求b。a為1*3的向量,μk為3*1的向量,相乘后b為一常量,由此可以求得常量b的值。

    這里又分為兩種情況:
    ①輸入圖為單通道:按照上述步驟計算即可。
    ②輸入圖為三通道:先分離三個通道,對每個通道進行上述濾波操作,然后合並通道即可。

    注:引導圖為彩色圖比引導圖為灰度圖,邊界保護更加明顯,見原文。

  • 效果驗證

      代碼里面求均值部分,可以由OpenCV中的boxFilter()函數實現,或者blur()函數實現。總之是一個均值濾波器,之所以與窗口大小無關,是因為使用直方圖實現的均值濾波,能夠大大降低運算時間。VS2015+OpenCV3.4.0實現的代碼放在我的碼雲code上:https://gitee.com/rxdj/guidedFilter.git
      主要輸入參數就是引導圖I,輸入圖P,窗口半徑r,截斷值
ε,輸出參數為濾波后圖像Q。引導圖I和輸入圖像P可以相同,也可以不同,比如stereo matching中常常用原參考圖像作為引導圖,對代價空間圖進行引導圖濾波以實現代價聚合。這樣能盡量保留原圖像邊界區域的匹配代價,而平滑平坦區域的匹配代價。
   
   (注:文獻中的代碼是通過matlab編寫的,matlab中讀取圖像時會自動將圖像歸一化到0-1,因此截斷值ε的設置也對應小很多,比如0.1,0.01等。而本文中讀取圖像后未進行歸一化操作,所以截斷值ε的設置會有不同。如果需要歸一化,則自行讀取圖像后除以255即可)。

  1. 單通道灰度圖原圖


    改變截斷值ε
      r=10, ε=0                            r=10,  ε=100            
        

    r=10 , ε=2000                          r=10, ε=8000 
       
     
     
    改變窗口半徑r
     r=0, ε=500                                   r=5, ε=500 

                                     
      
               r=10, ε=500                              r=20, ε=500 
               

  1. 三通道彩色圖
    原圖


    改變截斷值ε
      r=10, ε=0                            r=10,  ε=100                           
         
      
    r=10 , ε=2000                          r=10, ε=8000 
        


    改變窗口半徑r
    r=0, ε=500                             r=5, ε=500                            
            

    r=10, ε=500                              r=20, ε=500 
        

  • 快速引導圖濾波算法
          快速引導圖濾波算法見文獻《fast guided filter》,上述主頁中也有。快速的地方主要是采用了圖像金字塔思想。步驟如下:

  1. 對引導圖像I和輸入圖像P進行1/s的降采樣,得到I', P';
  2. 利用I'和P'計算系數a和b,並計算輸出圖像Q';
  3. 將Q'進行s倍的上采樣得到最終輸出圖像Q。

       由於計算部分是降采樣的圖像,運算量會大大減小,而不會引入明顯的失真,因此成為快速引導圖濾波。代碼見上述碼雲code鏈接的fastGuidedFilter分支。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM