1. 程式人生 > >C++ Opencv——影象濾波——雙邊濾波bilateralFilter

C++ Opencv——影象濾波——雙邊濾波bilateralFilter

轉:

雙邊濾波是一種非線性濾波器,它可以達到保持邊緣、降噪平滑的效果。和其他濾波原理一樣,雙邊濾波也是採用加權平均的方法,用周邊畫素亮度值的加權平均代表某個畫素的強度,所用的加權平均基於高斯分佈。最重要的是,雙邊濾波的權重不僅考慮了畫素的歐氏距離(如普通的高斯低通濾波,只考慮了位置對中心畫素的影響),還考慮了畫素範圍域中的輻射差異(例如卷積核中畫素與中心畫素之間相似程度、顏色強度,深度距離等),在計算中心畫素的時候同時考慮這兩個權重。

高斯濾波:

雙邊濾波:

 

g(i, j)代表輸出點;
S(i, j)的是指以(i,j)為中心的(2N+1)(2N+1)的大小的範圍;
f(k, l)代表(多個)輸入點;
w(i, j, k, l)代表經過兩個高斯函式計算出的值(這裡還不是權值)

上述公式我們進行轉化,假設公式中w(i,j,k,l)為m,則有

 設 m1+m2+m3 … +mn = M,則有
這裡寫圖片描述

w(i, j, k, l):ws為空間臨近高斯函式,wr為畫素值相似度高斯函式


這裡寫圖片描述
這裡寫圖片描述

這裡寫圖片描述

雙邊濾波的核函式是空間域核(空間域(spatial domain S))與畫素範圍域核(畫素範圍域(range domain R))的綜合結果:在影象的平坦區域,畫素值變化很小,對應的畫素範圍域權重接近於1,此時空間域權重起主要作用,相當於進行高斯模糊;在影象的邊緣區域,畫素值變化很大,畫素範圍域權重變大,從而保持了邊緣的資訊。

演算法實現:

void bilateralFilter(src, dst, d, sigmaColor, sigmaSpace, BORDER_DEFAULT)
/*
. InputArray src: 輸入影象,可以是Mat型別,影象必須是8位或浮點型單通道、三通道的影象。 
. OutputArray dst: 輸出影象,和原影象有相同的尺寸和型別。 
. int d: (直徑範圍)表示在過濾過程中每個畫素鄰域的直徑範圍。如果這個值是非正數,則函式會從第五個引數sigmaSpace計算該值。 
. double sigmaColor:(sigma顏色) 顏色空間過濾器的sigma值,這個引數的值月大,表明該畫素鄰域內有月寬廣的顏色會被混合到一起,產生較大的半相等顏色區域。 
. double sigmaSpace:(sigma空間) 座標空間中濾波器的sigma值,如果該值較大,則意味著顏色相近的較遠的畫素將相互影響,從而使更大的區域中足夠相似的顏色獲取相同的顏色。當d>0時,d指定了鄰域大小且與sigmaSpace五官,否則d正比於sigmaSpace. 
. int borderType=BORDER_DEFAULT: 用於推斷影象外部畫素的某種邊界模式,有預設值BORDER_DEFAULT.
*/
bilateralFilter(src, dst, 10, 10, 10);