OpenCV-濾波算子(一)

OpenCV-濾波算子(一)


author@jason_ql
http://blog.csdn.net/lql0716


平滑處理(smoothing)也稱模糊處理(bluring),常用來減少圖像上的噪點或者失真。

1、線性濾波:

1.1 方框濾波:BoxBlur()

方框濾波一般用來模糊一張圖片。

C++:void bosFilter(InputArray src, OutputArray dst, int ddepth, Size ksize, Point anchor=Point(-1,-1), boolnormalize=true, int borderType=BORDER_DEFAULT)

參數:
第一個參數:InputArray類型的src,輸入圖像,即原圖像,填Mat類的對象即可。該函數對通道是獨立處理的,且可以處理任意通道數的圖片。但需注意,待處理的圖片深度應該是CV_8U、CV_16U、CV_16S、CV_32F、CV_64F之一。
第二個參數:OutputArray類型的dst,即目標圖像,需要和原圖片有一樣的尺寸和類型。
第三個參數:int類型的ddepth,輸出圖像的深度。“-1”代表使用原圖深度,即src.depth()。
第四個參數:Size類型的ksize,內核的大小。一般用Size(w,h)的寫法來表示內核的大小(其中,w爲像素寬度,h爲像素高度)。例如Size(3,3)表示3x3的核大小;Size(5,5)表示5x5的核大小。
第五個參數:Point類型的anchor,表示錨點(即被平滑的那個點),注意,它有默認值Point(-1,-1)。如果這個點座標是負值的話,就表示取核的中心爲錨點,所以默認值Point(-1,-1)表示這個錨點在覈的中心。
第六個參數:bool類型的normalize,默認值爲true,一個標識符,表示內核是否被其區域歸一化(normalized)了。
第七個參數:int類型的borderType,用於推斷圖像外部像素的某種邊界模式。有默認值BORDER_DEFAULT,我們一般不去管它。

1.2 均值濾波:Blur()

C++: void blur(InputArray src, OutputArray dst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT)

第一個參數:InputArray類型的src,輸入圖像,即原圖像,填Mat類的對象即可。該函數對通道是獨立處理的,且可以處理任意通道數的圖片。但需注意,待處理的圖片深度應該是CV_8U、CV_16U、CV_16S、CV_32F、CV_64F之一。
第二個參數:OutputArray類型的dst,即目標圖像,需要和原圖片有一樣的尺寸和類型。
第三個參數:Size類型的ksize,內核的大小。一般用Size(w,h)的寫法來表示內核的大小(其中,w爲像素寬度,h爲像素高度)。例如Size(3,3)表示3x3的核大小;Size(5,5)表示5x5的核大小。
第四個參數:Point類型的anchor,表示錨點(即被平滑的那個點),注意,它有默認值Point(-1,-1)。如果這個點座標是負值的話,就表示取核的中心爲錨點,所以默認值Point(-1,-1)表示這個錨點在覈的中心。
第五個參數:int類型的borderType,用於推斷圖像外部像素的某種邊界模式。有默認值BORDER_DEFAULT,我們一般不去管它。

1.3 高斯濾波:GaussianBlur()

高斯濾波一般用來模糊一張圖片。

C++: void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT)

第一個參數:InputArray類型的src,輸入圖像,即原圖像,填Mat類的對象即可。該函數對通道是獨立處理的,且可以處理任意通道數的圖片。但需注意,待處理的圖片深度應該是CV_8U、CV_16U、CV_16S、CV_32F、CV_64F之一。
第二個參數:OutputArray類型的dst,即目標圖像,需要和原圖片有一樣的尺寸和類型。
第三個參數:Size類型的ksize,內核的大小。一般用Size(w,h)的寫法來表示內核的大小(其中,w爲像素寬度,h爲像素高度)。例如Size(3,3)表示3x3的核大小;Size(5,5)表示5x5的核大小。
第四個參數:double類型的sigmaX,表示高斯函數在X方向的標準偏差。
第五個參數:double類型的sigmaY,表示高斯核函數在Y方向的標準差。若sigmaY爲零,就將它設爲sigmaX,如果sigmaX和sigmaY都是0,那麼久有ksize.width和ksize.height計算出來。爲了結果的正確性着想,最好把第三個參數Size、第四個參數sigmaX和第五個參數sigmaY全部指定到。
第六個參數:int類型的borderType,用於推斷圖像外部像素的某種邊界模式。有默認值BORDER_DEFAULT,我們一般不去管它。

2、非線性濾波:

2.1 中值濾波:medianBlur()

中值濾波一般用來平滑(模糊)處理一張圖片。

C++: void medianBlur(InputArray src, OutputArray dst, int ksize)

第一個參數:InputArray類型的src,函數的輸入參數,填1、3或4通道的Mat類型的圖像。當ksize爲3或5的時候,圖像深度需爲CV_8U、CV_16U、CV_32F其中之一,而對於較大孔徑尺寸的圖片,它只能是CV_8U。
第二個參數:OutputArray類型的dst,即目標圖像,函數的輸出參數,需要和原圖像有一樣的尺寸和類型。我們可以用Mat::Clone,以原圖片爲模板,來初始化得到如假包換的目標圖。
第三個參數:int類型的ksize,孔徑的線性尺寸(aperture linear size),注意這個參數必須是大於1的奇數,比如3、5、7、9……

2.2 雙邊濾波:bilateralFilter()

雙邊濾波一般用來模糊處理一張圖片。

C++: void bilateralFilter(InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, int borderType=BORDER_DEFAULT)

第一個參數:InputArray類型的src,輸入圖像,即原圖像,需要爲8爲或浮點型單通道、三通道的圖像。
第二個參數:OutputArray類型的dst,即目標圖像,需要和原圖片有一樣的尺寸和類型。
第三個參數:int類型的d,表示在過濾過程中每個像素鄰域的直徑。如果這個值被設爲非正數,那麼Opencv會從第五個參數sigmaSpace來計算出它。
第四個參數:double類型的sigmaColor,顏色空間濾波器的sigma值。這個參數的值越大,就表明該像素鄰域內越寬廣的顏色會被混合到一起,產生較大的半相等顏色區域。
第五個參數:double類型的sigmaSpace,座標空間中值濾波器的sigma值,座標空間的標準方差。它的數值越大,意味着越遠的像素會相互影響,從而使更大的區域中足夠相似的顏色獲取相同的顏色。當d>0 時,d指定了鄰域大小且與sigmaSpace無關。否則,d正比於sigmaSpace。
第六個參數:int類型的borderType,用於推斷圖像外部像素的某種邊界模式。注意它有默認值BORDER_DEFAULT。

3、方框、均值、高斯、中值、雙邊濾波代碼示例

#include <opencv2\opencv.hpp>
//#include <opencv2\core\core.hpp>
//#include <opencv2\highgui\highgui.hpp>
//#include <opencv2\imgproc\imgproc.hpp>

using namespace cv;
using namespace std;

string path = "D:/test/source/img/031.jpg";
cv::Mat img = cv::imread(path);
cv::Mat dst, dst2, dst3, dst4, dst5;

int main()
{

    cv::namedWindow("原圖");
    cv::imshow("原圖", img);

    //方框濾波
    cv::namedWindow("方框濾波——效果圖");
    cv::boxFilter(img, dst, -1, cv::Size(5, 5));
    cv::imshow("方框濾波——效果圖", dst);

    //均值濾波
    cv::namedWindow("均值濾波——效果圖");
    cv::blur(img, dst2, cv::Size(7, 7));
    cv::imshow("均值濾波——效果圖", dst2);

    //高斯濾波
    cv::namedWindow("高斯濾波——效果圖");
    cv::GaussianBlur(img, dst3, cv::Size(7, 7), 0, 0);
    cv::imshow("高斯濾波——效果圖", dst3);

    //中值濾波
    cv::namedWindow("中值濾波——效果圖");
    cv::medianBlur(img, dst4, 7);
    cv::imshow("中值濾波——效果圖", dst4);

    //雙邊濾波
    cv::namedWindow("雙邊濾波——效果圖");
    cv::bilateralFilter(img, dst5, 25, 25 * 2, 25 / 2);
    cv::imshow("雙邊濾波——效果圖", dst5);

    cv::waitKey(0);
    return 0;

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章