在上次的opencv源碼解析之濾波前言1中,按照opencv_tutorials.pdf中的濾波部分試了下常用的4種濾波器的使用方法。在opencv的C++中,這4個函數分別為:blur,GaussianBlur,meidaBlur,bilateralFilter.下面就這幾個函數在opencv中的功能,以及參數做個介紹:
- 均值濾波:其函數聲明為:void blur(InputArray src, OutputArray dst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT )。
這個函數在上一節中介紹過了,這里簡單些一下。
功能:對輸入的圖像src進行均值濾波后用dst輸出。
參數:src和dst當然分別是輸入圖像和輸出圖像。size為均值濾波器模板大小。Anchor為錨點(具體什么沒看源碼不懂),如果為Point(-1,-1),則錨點是濾波器的中心點。borderType為邊緣點插值類型。
理解:以原圖對應像素為中心的與模板中心重疊,將模板覆蓋領域內全部像素求均值就是濾波后像素的值了。
- 高斯濾波:其函數聲明為: void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT ) ;
功能:對輸入的圖像src進行高斯濾波后用dst輸出。
參數:src和dst當然分別是輸入圖像和輸出圖像。Ksize為高斯濾波器模板大小,sigmaX和sigmaY分別為高斯濾波在橫線和豎向的濾波系數(有點晦澀,等下解釋)。borderType為邊緣點插值類型。
理解:數字圖像的濾波可以簡單的這么理解,就是對原圖像的每一個像素濾波,那么對應這個像素濾波后的值是根據其相鄰像素(包括自己那個點)與一個濾波模板進行相乘即可。所以具體到高斯濾波,我們只要知道這個高斯濾波的模板即可。
那怎么確定這個模板呢?首先這個模板的大小為ksize,其每個數字的計算是這樣的:
其中 是歸一化系數,因為其和要為1.
為了簡化,一般在二維圖像處理中,ui和uj取0,sigma1和sigma2取相等。所以公式就簡化為 :
因此很容易就計算出模板每個位置的數字了,簡單吧!
但是要注意2點,第一點就是ksize的寬和高必須是奇數;第二點就是如果參數sigmaX=sigmaY=0,則實際用的是公式sigma = 0.3*((ksize-1)*0.5 - 1) + 0.8 .
- 中值濾波:其函數聲明為void medianBlur(InputArray src, OutputArray dst, int ksize)。
功能:對輸入的圖像src進行中值濾波后用dst輸出。
參數:src和dst當然分別是輸入圖像和輸出圖像。ksize為均值濾波器模板大小,因為模板為正方形,所以只有一個參數。
理解:以原圖對應像素為中心的與模板中心重疊,將模板覆蓋領域內全部像素排序后的中間值就是濾波后像素的值了,所以模板長度必須為奇數。
- 雙向濾波:其函數聲明為:void bilateralFilter(InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, int borderType=BORDER_DEFAULT )
功能:對輸入的圖像src進行雙向濾波后用dst輸出。
參數:src和dst當然分別是輸入圖像和輸出圖像。d為每個像素領域的直徑,sigmaColor為顏色空間的標准偏差,sigmaSpace為坐標空間的標准偏差。borderType為邊緣點插值類型。
理解:暫時不明白雙向濾波的工作原理,以后有時間弄懂再補上吧,也歡迎大家補上。
就寫到這里吧,輸入公式和文字都累死了!並且寫這種文章怎么感覺在寫翻譯文檔呢!