引導圖濾波器是一種自適應權重濾波器,能夠在平滑圖像的同時起到保持邊界的作用,具體公式推導請查閱原文獻《Guided Image Filtering》以及matlab源碼:http://kaiminghe.com/eccv10/index.html。這里只說一下自適應權重原理、C++實現灰度圖像以及彩色圖像的引導圖濾波、驗證結果。
- 自適應權重原理
引導圖濾波作為一種線性濾波器,可以簡單定義為如下形式:其中I是引導圖像(guided Image),P是輸入的待濾波圖像,Q是濾波后的輸出圖像,W是根據引導圖I確定的權重值。權重值W可以用下式表示(原文獻有詳細推導):
μk是窗口內像素點的均值,Ii和Ij指相鄰兩個像素點的值,σk代表窗口內像素點的方差,ε是一個懲罰值。自適應權重可以根據上式分析得到:Ii和Ij在邊界兩側時,(Ii-μk)和(Ij-μk)異號,否則,則同號。而異號時的權重值將遠遠小於同號時的權重值,這樣處於平坦區域的像素則會被加以較大的權重,平滑效果效果更明顯,而處於邊界兩側的像素則會被加以較小的權重,平滑效果較弱,能夠起到保持邊界的效果。
懲罰值ε對濾波效果影響也很大,當ε值很小時,濾波如前面所述;當ε值很大時,權重的計算公式將近似為一個均值濾波器,平滑效果會更明顯。
同樣也可以根據線性濾波公式來看引導圖濾波的自適應權重原理,局部線性濾波模型公式如下:I指引導圖像,Q是輸出圖像,ak和bk兩個系數根據引導圖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.引導圖為三通道的彩色圖。
- 引導圖為單通道
分別算出I與P的均值圖像,以及I²和I*P的均值圖像;再求出I的方差圖像,以及I*P的協方差圖像;利用公式求出a和b的值;再窗口內對a和b求均值;再根據公式算出輸出圖像。
這里又分為兩種情況:
①輸入圖為單通道:按照上述步驟計算即可。
②輸入圖為三通道:先分離三個通道,對每個通道進行上述濾波操作,然后合並通道即可。 - 引導圖為三通道
此時,將上述模型做了稍微修改,如下:
不同之處在於求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即可)。
- 單通道灰度圖原圖
改變截斷值ε
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
- 三通道彩色圖
原圖
改變截斷值ε
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》,上述主頁中也有。快速的地方主要是采用了圖像金字塔思想。步驟如下:
- 對引導圖像I和輸入圖像P進行1/s的降采樣,得到I', P';
- 利用I'和P'計算系數a和b,並計算輸出圖像Q';
- 將Q'進行s倍的上采樣得到最終輸出圖像Q。
由於計算部分是降采樣的圖像,運算量會大大減小,而不會引入明顯的失真,因此成為快速引導圖濾波。代碼見上述碼雲code鏈接的fastGuidedFilter分支。