一、線性濾波與非線性濾波
之前一篇文章說的方框濾波只泼、均值濾波和高斯濾波都是線性濾波器的原始數(shù)據(jù)與濾波結(jié)果是一種線性的算術(shù)運算剖笙,即用加減乘除等運算實現(xiàn),所以稱之為線性濾波请唱。
非線性濾波器的原始數(shù)據(jù)與濾波結(jié)果是一種邏輯關(guān)系弥咪,即通過比較一定鄰域內(nèi)的灰度值大小來實現(xiàn)的。下面介紹的中值濾波和雙邊濾波就是非線性濾波籍滴。
二酪夷、中值濾波
中值濾波原理通過一張圖就可以看明白:
簡言之中值濾波就是把函數(shù)框(如圖中的3 X 3)內(nèi)的灰度值按順序排列,然后中值取代函數(shù)框中心的灰度值孽惰。所以一般采用奇數(shù)點的鄰域來計算中值晚岭,但如果像素點數(shù)為偶數(shù),中值就取排序像素中間兩點的平均值勋功。
中值濾波在一定的條件下可以克服常見線性濾波器如方框濾波器坦报、均值濾波等帶來的圖像細節(jié)模糊库说,而且對濾除脈沖干擾及圖像掃描噪聲非常有效,也常用于保護邊緣信息, 保存邊緣的特性使它在不希望出現(xiàn)邊緣模糊的場合也很有用片择,是非常經(jīng)典的平滑噪聲處理方法潜的。
但是中值濾波的缺點也很明顯,因為要進行排序操作字管,所以處理的時間長啰挪,是均值濾波的5倍以上。
中值濾波在OpenCV中用medianBlur函數(shù)實現(xiàn)嘲叔,下面是函數(shù)聲明:
void medianBlur( InputArray src, OutputArray dst, int ksize );
參數(shù)很簡單亡呵,就是輸入圖像src,輸出圖像dst硫戈,以及核的大小ksize锰什。注意這里的ksize必須為正奇數(shù)1,3,5,7……否則程序會出錯。
三丁逝、雙邊濾波
雙邊濾波(Bilateral filter)是一種非線性的濾波方法汁胆,是結(jié)合圖像的空間鄰近度和像素值相似度的一種折衷處理,同時考慮空域信息和灰度相似性霜幼,達到保邊去噪的目的嫩码。具有簡單、非迭代罪既、局部的特點谢谦。
雙邊濾波器的好處是可以做邊緣保存(edge preserving),一般用高斯濾波去降噪萝衩,會較明顯地模糊邊緣回挽,對于高頻細節(jié)的保護效果并不明顯。雙邊濾波器顧名思義比高斯濾波多了一個高斯方差sigma-d猩谊,它是基于空間分布的高斯濾波函數(shù)千劈,所以在邊緣附近,離的較遠的像素不會太多影響到邊緣上的像素值牌捷,這樣就保證了邊緣附近像素值的保存墙牌。但是由于保存了過多的高頻信息,對于彩色圖像里的高頻噪聲暗甥,雙邊濾波器不能夠干凈的濾掉喜滨,只能夠?qū)τ诘皖l信息進行較好的濾波。
下圖是雙邊濾波的原理示意圖:
在雙邊濾波器中撤防,輸出像素的值依賴于鄰域像素值的加權(quán)值組合:
而加權(quán)系數(shù)w(i,j,k,l)取決于空域核和值域核的乘積虽风。
(i,j),(k,l)分別指兩個像素點的坐標(biāo)。
其中空域核表示如下(如圖):
值域核表示為:
兩者相乘后辜膝,就會產(chǎn)生依賴于數(shù)據(jù)的雙邊濾波權(quán)重函數(shù):
d函數(shù)是根據(jù)像素距離選擇權(quán)重无牵,距離越近權(quán)重越大,這一點和方框濾波厂抖,高斯濾波方式相同茎毁。而r函數(shù)則是根據(jù)像素的差異來分配權(quán)值。如果兩個像素值越接近忱辅,即使相距較遠七蜘,也比差異大而距離近的像素點權(quán)重大。正是r函數(shù)的作用墙懂,使得邊緣崔梗,即相距近但差異大的像素點的特性得以保留。
OpenCV中用medianBlur函數(shù)實現(xiàn)雙邊濾波垒在。
函數(shù)聲明:
void bilateralFilter( InputArray src, OutputArray dst, int d,
double sigmaColor, double sigmaSpace,
int borderType = BORDER_DEFAULT );
參數(shù):
- 第一個參數(shù),InputArray類型的src扔亥,輸入圖像场躯,即源圖像,需要為8位或者浮點型單通道旅挤、三通道的圖像踢关。
- 第二個參數(shù),OutputArray類型的dst粘茄,即目標(biāo)圖像签舞,需要和源圖片有一樣的尺寸和類型。
- 第三個參數(shù)柒瓣,int類型的d儒搭,表示在過濾過程中每個像素鄰域的直徑。如果這個值我們設(shè)其為非正數(shù)芙贫,那么OpenCV會從第五個參數(shù)sigmaSpace來計算出它來搂鲫。
- 第四個參數(shù),double類型的sigmaColor磺平,顏色空間濾波器的sigma值魂仍。這個參數(shù)的值越大,就表明該像素鄰域內(nèi)有更寬廣的顏色會被混合到一起拣挪,產(chǎn)生較大的半相等顏色區(qū)域擦酌。
- 第五個參數(shù),double類型的sigmaSpace坐標(biāo)空間中濾波器的sigma值菠劝,坐標(biāo)空間的標(biāo)注方差赊舶。他的數(shù)值越大,意味著越遠的像素會相互影響,從而使更大的區(qū)域足夠相似的顏色獲取相同的顏色锯岖。當(dāng)d>0介袜,d指定了鄰域大小且與sigmaSpace無關(guān)。否則出吹,d正比于sigmaSpace遇伞。
- 第六個參數(shù),int類型的borderType捶牢,用于推斷圖像外部像素的某種邊界模式鸠珠。注意它有默認(rèn)值BORDER_DEFAULT。
四秋麸、示例代碼:
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include<opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace cv;
int main(){
Mat img = imread("dog.jpg");//據(jù)說丑女經(jīng)過雙邊濾波用有美顏效果哦渐排,有興趣的同學(xué)可以試試
Mat out1,out2,out3;
medianBlur(img, out1, 35);
bilateralFilter(img, out2, 25, 25 * 2, 25 / 2);
namedWindow("中值濾波", 2);
imshow("中值濾波", out1);
namedWindow("雙邊濾波", 2);
imshow("雙邊濾波", out2);
waitKey(0);
return 0;
}
參考:
http://blog.csdn.net/poem_qianmo/article/details/23184547