一、圖像濾波簡介
濾波實際上是信號處理的一個概念,圖像可以看成一個二維信號,其中像素點灰度值的高低代表信號的強弱:
高頻:圖像中變化劇烈的部分
低頻:圖像中變化緩慢,平坦的部分
根據圖像高低頻特性,設置高通和低通濾波器。
高通濾波可以檢測圖像中尖銳、變化明顯的地方,低通濾波可以讓圖像變得平滑,消除噪聲干擾。
圖像濾波是OpenCV圖像處理的重要部分,在圖像預處理方面應用廣泛,圖像濾波的好壞決定着後續處理的結果好壞。
以下主要介紹低通濾波部分(圖像平滑去噪),主要介紹的圖像濾波函數方法:
線性濾波:方框濾波、均值濾波、高斯濾波。
二、
鄰域算子:利用給定像素周圍的像素值決定此像素的最終輸出值的一種算子。
線性濾波:一種常用的鄰域算子,像素輸出取決於輸入像素的加權和,如下圖所示:
線性濾波器輸出像素g(i, j)是輸入像素f(i+k, j+I)的加權和,其中h(k, l)我們稱之爲核,是濾波器的加權係數。
方框濾波用到的核:
當normalize爲true時,方框濾波也就成了均值濾波。也就是說均值濾波是方框濾波歸一化後的特殊情況。歸一化就是將要處理的量縮放到一定範圍,比如(0, 1)。
函數原型:
CV_EXPORTS_W void boxFilter( InputArray src, OutputArray dst, int ddepth,
Size ksize, Point anchor=Point(-1,-1),
bool normalize=true,
int borderType=BORDER_DEFAULT );
ddepth: 輸出圖像的深度, -1代表使用原圖像深度,即src.depth();
ksize: Size類型表示內核大小,一般用Size(w,h)表示內核大小, Size(3,3)表示3x3的核大小;
anchor: 表示錨點(即被平滑的那個點), 默認值;
Point(-1, -1),表示錨點在覈中心;
normalize: 默認值true, 標識符, 表示內核是否被歸一化;
borderType: 圖像像素邊界模式,一般用默認值即可;
(二)、均值濾波---blur()
均值濾波用到的核:
均值濾波即方框濾波歸一化特例,就是用鄰域內像素均值來代替該點像素值,均值濾波在去噪的同時也破壞了圖像細節部分。
函數原型:
CV_EXPORTS_W void blur( InputArray src, OutputArray dst,
Size ksize, Point anchor=Point(-1,-1),
int borderType=BORDER_DEFAULT );
ksize: Size類型表示內核大小,一般用Size(w,h)表示內核大小, Size(3,3)表示3x3的核大小;
anchor: 表示錨點(即被平滑的那個點), 默認值Point(-1, -1),表示錨點在覈中心;
borderType: 圖像像素邊界模式,一般用默認值即可;
(三)、高斯濾波---blurGaussianBlur()
高斯濾波器被稱爲最有用的濾波器,每個像素點都是由本身和鄰域內的其他像素值經過加權平均後得到的, 加權係數越靠近中心越大, 越遠離中心越小, 能夠很好的濾除噪聲。
函數原型:
CV_EXPORTS_W void GaussianBlur( InputArray src,
OutputArray dst, Size ksize,
double sigmaX, double sigmaY=0,
int borderType=BORDER_DEFAULT );
ksize: 高斯內核大小,一般用Size(w,h)表示內核大小, w, h可以不同, 但是必須爲正奇數或者0, 由sigma計算得來;
sigmaX: 表示高斯函數在X方向上的標準偏差;
sigmaY: 表示高斯函數在Y方向上的標準偏差, 若sigmaY=0, 就將它設置爲sigmaX;
若sigmaY=0 && sigmaX=0則由ksize.width和ksize.height計算出來;
borderType: 圖像像素邊界模式,一般用默認值即可。
(四)、中值濾波---medianBlur()
中值濾波是一種非線性濾波, 是用像素點鄰域灰度值的中值代替該點的灰度值, 可以去除脈衝噪聲和椒鹽噪聲.
median({1,2,3,3,7,5,1,8})=3 排序後的中間那個值
函數原型:
CV_EXPORTS_W void medianBlur( InputArray src, OutputArray dst, int ksize );
ksize: int類型的孔徑的線性尺寸, 大於1的奇數.
(五)、雙邊濾波---bilateralFilter()
雙邊濾波是一種非線性濾波, 是結合圖像空間鄰近度和像素值相似度的一種折中處理, 儘量在去噪同時保存邊緣。
CV_EXPORTS_W void bilateralFilter( InputArray src, OutputArray dst, int d,
double sigmaColor, double sigmaSpace,
int borderType=BORDER_DEFAULT );
d: 表示過濾過程中每個像素的鄰域直徑;
sigmaColor: 顏色空間濾波器sigma值, 值越大表面該像素鄰域內有越廣泛的顏色會混到一起,產生較大的半相等顏色區域;
sigmaSpace: 座標空間中濾波器的sigma值, 座標空間的標準方差;
borderType: 圖像像素邊界模式,一般用默認值即可。