原文:
原文有圖
還有一種解釋:
雙邊濾波(bilateral filter)是非線性濾波中的一種。這是一種結合影象的空間鄰近度與畫素值相似度的處理辦法。在濾波時,該濾波方法同時考慮空間臨近資訊與顏色相似資訊,在濾除雜訊、平滑影象的同時,又做到邊緣儲存。
雙邊濾波採用了兩個高斯濾波的結合。乙個負責計算空間鄰近度的權值,也就是常用的高斯濾波器原理。而另乙個負責計算畫素值相似度的權值。在兩個高斯濾波的同時作用下,就是雙邊濾波。
看到這裡,博主認為你對高斯濾波(空間臨近)已經理解並掌握了,那麼我們開始對雙邊濾波進行講解。
在上面兩篇文章中提到,高斯濾波(空間臨近)是將二維高斯正態分佈放在影象矩陣上做卷積運算。考慮的是鄰域內畫素值的空間距離關係。通過在核大小範圍內,各個點到中心點的空間臨近度計算出對應的權值,並將計算好的核與影象矩陣作卷積。最後,影象經過濾波後達到平滑的效果,而影象上的邊緣也會有一定程度的平滑,使得整個影象變得模糊,邊緣得不到儲存。
雙邊濾波的基本思想是:將高斯濾波(空間臨近)的原理中,通過各個點到中心點的空間臨近度計算的各個權值進行優化,將其優化為空間臨近度計算的權值 和 畫素值相似度計算的權值的乘積,優化後的權值再與影象作卷積運算。從而達到保邊去噪的效果。
一、雙邊濾波的公式
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,則有
此時可以看到,這明顯是影象矩陣與核的卷積運算了。其中m1/m代表的第乙個點(或最後乙個點,看後面如何實現)的權值,而影象矩陣與核通過卷積運算元作加權和,最終得到輸出值。
接下來我們來討論最關鍵的w(i, j, k, l)
ws為空間臨近高斯函式,wr為畫素值相似度高斯函式
可以看到,w是ws和wr的乘積。對於ws來說,這就是普通的高斯濾波函式,其代入的座標,sigmas是程式輸入值,該函式是在空間臨近度上計算的。
而wr是計算畫素值相似度(顏色空間),注意,這就是高斯函式代入座標值,2sigmar^2的上方是範數,在這裡的值為 |f(i,j)-f(k,l)|^2。也就是兩個點畫素值差值的絕對值的平方。其中,彩色計算差值時應將(i,j)點的rgb三通道值之和減去(k,l)點的rgb三通道值之和。這裡是顏色空間計算,不能當成單通道,但是在最後矩陣卷積時,是單通道與權值相乘而不是三個通道之和。
二、雙邊濾波權值分布(**於網路)
(1)當影象在變化程度平緩的區域時,鄰域中的畫素值(rgb值)差距相差不大。此時wr無限接近於1,因此此時的雙邊就是普通的高斯濾波,達到對影象平滑的效果。
(2) 當影象在變化程度劇烈的區域,比如在邊緣區域時,鄰域中的畫素值(rgb值)差距相差很大。此時wr朝0值趨近,顏色差值越大,wr越逼近0,最終整個式子的值逼近於0。最終的結果是權值為0。因此在最終計算時,該處將不影響輸出值。
通過此種方式,其既能平滑影象,又保持了影象的邊緣。
三、雙邊濾波實現(**於網路)
首先來看下雙邊濾波的效果
該函式有三個引數,濾波板(核)半徑n、引數sigmas和sigmar.
(1) main函式實現
int main(void)
(2)雙邊濾波主函式,注意,現在的權值並沒有進行歸一化,歸一化需要在計算時,根據第一大點中講解的公式進行計算。
/* 雙邊濾波函式 */
void mybialteralfilter(cv::mat *src, cv::mat *dst, int n, double sigmas, double sigmar)
(3)高斯函式帶入座標(空間臨近)
/* 計算空間權值 */
double **get_space_array( int _size, int channels, double sigmas)
// [1-2] 高斯分布計算
int center_i, center_j;
center_i = center_j = _size / 2;
_spacearray[_size][0] = 0.0f;
// [1-3] 高斯函式
for (i = 0; i < _size; i++)
}return _spacearray;
}(4)高斯函式代入座標值(顏色空間)
/* 計算相似度權值 */
double *get_color_array(int _size, int channels, double sigmar)
return _colorarray;
}(5)濾波
/* 雙邊 掃瞄計算 */
void dobialteral(cv::mat *_src, int n, double *_colorarray, double **_spacearray)
;int x, y, values;
double space_color_sum = 0.0f;
// 注意: 公式後面的點都在核大小的範圍裡
// 雙邊公式 g(ij) = (f1*m1 + f2*m2 + ... + fn*mn) / (m1 + m2 + ... + mn)
// space_color_sum = (m1 + m12 + ... + mn)
for (int k = 0; k < _size; k++)
}// 計算過程
for (int k = 0; k < _size; k++) }}
for (int c = 0; c < 3; c++) }}
}// 放入原圖
(*_src) = temp.clone();
return ;
}
雙邊濾波(Bilateral filter)
強大的雙邊濾波器可平滑平坦區域,同時保持邊緣銳化。因此,它可作為乙個自動的 化或圖畫濾波器,其缺點是效率低 即該濾波器執行的時間要按秒,甚至分鐘而不是毫秒來計算 那麼如何 化一副影象時,還可接受其執行時間。最重要的技巧就是在低解析度下使用雙邊濾波,這會得到與高解析度下相似的效果,但執行速度更快。可將...
雙邊濾波(Bilateral filter)
雙邊濾波器 bilateral filter 是一種可以保邊去噪的濾波器。可以濾除影象資料中的雜訊,且還會保留住影象的邊緣 紋理等 因雜訊是高頻訊號,邊緣 紋理也是高頻資訊,高斯濾波會在濾除雜訊的同時使得邊緣模糊 那這麼優秀的乙個濾波器,他到底是個什麼呢,其實,它和我們普通的高斯濾波器一樣,也是使用...
雙邊濾波bilateralFilter
雙邊濾波是一種非線性的濾波方法,是結合影象的空間鄰近度和畫素值相似度的一種折衷處理,同時考慮空間與資訊和灰度相似性,達到保邊去噪的目的,具有簡單 非迭代 區域性處理的特點。之所以能夠達到保邊去噪的濾波效果是因為濾波器由兩個函式構成 乙個函式是由幾何空間距離決定濾波器係數,另乙個是由畫素差值決定濾波器...