一、領域濾波(卷積)
鄰域算子值利用給定像素周圍像素的值決定此像素的最終輸出。如圖左邊圖像與中間圖像卷積得到右邊圖像。目標圖像中綠色的像素由原圖像中藍色標記的像素計算得到。
通用線性鄰域濾波是一種常用的鄰域算子,輸入像素加權得到輸出像素:
其中權重核 爲“濾波係數”。上面的式子可以簡記爲:
二、線性濾波
1、方框濾波(box Filter)
最簡單的線性濾波是移動平均或方框濾波,用 K*K窗口中的像素值平均後輸出,核函數爲:
其實等價於圖像與全部元素值爲1的核函數進行卷積再進行尺度縮放。
下面提到的 blur 和 boxFilter 的區別是,blur是標準化後的 boxFilter,即boxFilter的核函數:
函數原型:
void boxFilter( InputArray src, OutputArray dst, int ddepth,Size ksize, Point anchor = Point(-1,-1),bool normalize = true,int borderType = BORDER_DEFAULT );
(1)參數src:輸入圖像
(2)參數dst:輸出圖像,和src有一樣的大小和類型
(3)ddepth:輸出圖像的深度。“-1”代表使用原圖深度
(4)ksize:內核大小,一般用Size(w,h)的寫法來表示內核的大小,w和h必須爲奇數
(5)anchor:錨點,默認Point(-1,-1)表示取核的中心爲錨點
2、均值濾波(blur)
函數原型:
void blur( InputArray src, OutputArray dst,Size ksize, Point anchor = Point(-1,-1),int borderType = BORDER_DEFAULT );
3、高斯濾波(GaussianBlur)
高斯濾波器是一類根據高斯函數的形狀來選擇權值的線性平滑濾波器。它對去除服從正態分佈的噪聲很有效。
常用的零均值離散高斯濾波器函數:
2D圖像中表示爲:
函數原型:
void GaussianBlur( InputArray src, OutputArray dst, Size ksize,double sigmaX, double sigmaY = 0,int borderType = BORDER_DEFAULT );
三、非線性濾波
線性濾波易於構造,且易於從頻率響應的角度分析,但如果噪聲是散粒噪聲而非高斯噪聲時線性濾波不能去除噪聲。如圖像突然出現很大的值,線性濾波只是轉換爲柔和但仍可見的散粒。這時需要非線性濾波。
1、中值濾波
中值濾波選擇每個鄰域像素的中值輸出
函數原型:
void medianBlur( InputArray src, OutputArray dst, int ksize );
2、雙邊濾波
雙邊濾波的思想是抑制與中心像素值差別太大的像素,輸出像素值依賴於鄰域像素值的加權合:
函數原型:
void bilateralFilter( InputArray src, OutputArray dst, int d,double sigmaColor, double sigmaSpace,int borderType = BORDER_DEFAULT );
示例:
1 Mat srcImage = imread("E:\\CodeResource\\opencv\\car_pic\\test.jpg"); 2 3 imshow("srcImage", srcImage); 4 5 Mat boxImage; 6 boxFilter(srcImage, boxImage, -1, Size(3, 3)); 7 8 Mat blurImage; 9 blur(srcImage, blurImage, Size(3, 3)); 10 11 Mat gaussImage; 12 GaussianBlur(srcImage, gaussImage, Size(3, 3), 0, 0); 13 14 Mat medianImage; 15 medianBlur(srcImage, medianImage, 7); 16 17 Mat bilateralImage; 18 bilateralFilter(srcImage, bilateralImage, 25, 25 * 2, 25 / 2); 19 20 imshow("boxImage", boxImage); 21 imshow("blurImage", blurImage); 22 imshow("gaussImage", gaussImage); 23 imshow("medianImage", medianImage); 24 imshow("bilateralImage", bilateralImage); 25 waitKey(0);
參考:http://blog.csdn.net/xiaowei_cqu/article/details/7785365