初學OpenCV的開發者很容易被OpenCV中各種濾波方法所困擾,不知道到底該用哪裏一個來做濾波。表面原因看起來是因爲OpenCV中各種濾波方式實在是太多太雜,其背後原因是對各種濾波方法的應用場景認知出現了問題,所以這裏小編從應用場景與項目中解決問題的實際出發,跟大家一起探討一下各種濾波方法。
一:模糊函數blur
參數說明
-參數InputArray表示輸入圖像Mat對象
-參數OutputArray表示模糊之後輸出Mat對象
-參數Size表示卷積核大小,此參數決定模糊程度,Size(x, y)其中x, y取值越大表現模糊程度越深,而且X與Y的值爲奇數。
-參數Point表示錨定的位置,也就是卷積核替換重疊像素中的哪個位置。此參數一般使用Point(-1,-1)表示使用卷積核的中心位置。
-最後一個參數表示對邊緣的處理方法,一般默認4表示默認處理方法
XY方向模糊-示例代碼:
效果顯示如下:
Y方向模糊-代碼示例
效果顯示如下
X方向模糊-代碼示例
效果顯示如下:
應用場景:
通過blur函數一般來去除噪聲,可以在圖像邊緣提取、特徵提取之前對圖像進行大小爲3x3的模糊以此來達到去掉干擾和噪聲目的
二:高斯模糊函數GaussianBlur
參數說明
-參數InputArray表示輸入圖像Mat對象
-參數OutputArray表示模糊之後輸出Mat對象
-參數Size表示卷積核大小,此參數決定模糊程度,Size(x, y)其中x, y取值越大表現模糊程度越深,而且X與Y的值爲奇數。
-參數SigmaX表示高斯方程中X方向的標準方差
-參數SigmaY表示高斯方程中X方向的標準方差
-最後一個參數表示對邊緣的處理方法,一般默認4表示默認處理方法
其中Size大小表示高斯卷積核、必須是奇數而且必須是正數、SigmaX在當Size大小不爲零的時候直接從Size大小計算、SigmaY在SigmaX不爲零的時候從X計算、SigmaX爲零的時候從Size大小中計算。
高斯模糊卷積核大小5x5-示例代碼
效果顯示
高斯模糊卷積核從SigmaX與SigmaY計算得到-代碼示例
效果顯示:
應用場景:
高斯模糊的應用場景一般作爲退化函數使用,可以去除圖像噪聲,Canny邊緣提取的第一步就是高斯模糊,以此來消除噪聲干擾,用高斯模糊去噪對於隨機噪聲效果明顯。
三:中值濾波函數-medianBlur
參數說明:
-參數InputArray表示輸入圖像Mat對象
-參數OutputArray表示模糊之後輸出Mat對象
-參數ksize表示卷積核大小,必須是正數而且必須是大於1,如:3、5、7等。
共有三個參數、其中第一個表示輸入圖像Mat對象,第二個表示濾波結果輸出Mat對象、第三個參數則表示卷積核的大小。
中值濾波-代碼示例
效果顯示
其中左邊原圖有椒鹽噪聲,中值濾波之後椒鹽噪聲被去除。
應用場景:
從上面的例子我們可以看出,中值濾波對椒鹽噪聲的圖像有比較好的效果,可以去除圖像中像素極大或者極小值。
四:雙邊模糊函數-bilateralFilter
參數說明:
-參數InputArray表示輸入圖像Mat對象
-參數OutputArray表示模糊之後輸出Mat對象
-參數d表示雙邊濾波時候中心到周圍像素距離
-參數sigmaColor表示高斯核中顏色值標準方差
-參數sigmaSpace表示高斯核中空間的標準方差
-參數borderType表示邊緣的處理方法
一共六個參數,其中如果參數d沒有申明的話或者是負數的話就從sigmaSpace中計算得到即可。常見的d取值爲15或者20如果過大會導致運算時間較長。
高斯雙邊模糊-代碼演示
效果顯示:
應用場景:
高斯雙邊濾波經常被用來實現圖像美化類APP用來做高斯磨皮核心算法,然後基於SOBEL算子進行疊加處理,通過高斯模糊得到最終結果。效果異常明顯,是一個不錯的選擇。
五:濾波函數filter2D
參數說明
-參數InputArray表示輸入圖像Mat對象
-參數OutputArray表示模糊之後輸出Mat對象
-參數d表輸出圖像的深度,-1表示跟輸入圖像深度相同。
-參數kernel表示自定義的Mat對象,卷積核或者算子。
-參數Point表示錨定的位置,Point(-1, -1)表示默認爲卷積核中心位置。
-參數delta表示卷積處理之後的每個像素值是否加上常量delta,默認0.0表示不加上額外值到處理後的像素值上。
-參數borderType表示邊緣像素的處理方式,默認爲BORDER_DEFAULT。
通過定義不同的卷積核、filter2D函數可以實現卷積的各種功能、包括模糊、銳化、邊緣提取等。下面我們就來一一通過代碼演示
實現模糊-代碼演示
演示效果:
實現邊緣提取-代碼演示
效果演示
實現銳化-代碼演示
效果演示
出了上述常見的三個卷積功能可以通過該函數自定義算子達成之外,還可以實現如下常見梯度算子效果。
Robot算子效果-代碼演示
效果如下
Sobel算子效果-代碼
效果如下:
應用場景:
filter2D是OpenCV中相當靈活的濾波函數、靈活使用可以適合多個不同應用場景,實現多種功能包括模糊、銳化、邊緣提取、圖像增強等等。
總結:
OpenCV中爲我們提供上述常見5種濾波函數,熟練掌握這五種濾波方法與應用場景是學以致用的關鍵。