1. 程式人生 > >opencv的幾種濾波運算元

opencv的幾種濾波運算元

1、 模糊函式blur濾波

//! a synonym for normalized box filter
CV_EXPORTS_W void blur( InputArray src, OutputArray dst,
                        Size ksize, Point anchor=Point(-1,-1),
                        int borderType=BORDER_DEFAULT );

引數說明:

InputArray 表示輸入影象Mat型別src,

OutputArray表示輸出影象Mat型別dst,

Size表示卷積核大小,此引數決定模糊程度,Size(x,y)其中x,y取值越大,表示模糊程度越深,而且x,y表示為奇數。

Point 表示錨定的位置,也就是卷積核替換重疊畫素中的哪個位置,此引數一般使用Point(-1,-1)表示使用卷積核的中心位置。

Type表示對邊緣的處理方法,一般預設為4,

  Mat src,dst;
 src = imread("C:\\Users\\934554314\\Desktop\\src.jpg", 1);
 cvtColor(src, src, CV_BGR2GRAY);
 namedWindow("src", WINDOW_NORMAL);
 imshow("src", src);
 
 blur(src, dst, Size(5, 5), Point(-1, -1), 4);
 namedWindow("dst", WINDOW_NORMAL);
imshow("dst", dst);
 waitKey(0);
 return;

測試圖片如下

 
 src = imread("C:\\Users\\934554314\\Desktop\\src.jpg", 1);
 blur(src, dst, Size(30, 1), Point(-1, -1), 4);//X方向模糊,

  src = imread("C:\\Users\\934554314\\Desktop\\src.jpg", 1);
  blur(src, dst, Size(1, 30), Point(-1, -1), 4);//Y方向模糊,

2、高斯模糊函式GaussianBlur

CV_EXPORTS_W void GaussianBlur( InputArray src,
                                               OutputArray dst, Size ksize,
                                               double sigmaX, double sigmaY=0,
                                               int borderType=BORDER_DEFAULT );

引數說明:SigmaX表示高斯方程中的X方向標準方差,

SigmaY表示高斯方程中的Y方向標準方差,

Type一般為預設值4;

Size表示高斯卷積核,必須是正奇數,SigmaX在當Size大小不為0 的時候從size大小計算,SigmaY在SigmaX不為零的時候從X計算、SigmaX為零的時候從Size大小中計算。

 src = imread("C:\\Users\\934554314\\Desktop\\src.jpg", 1);

 GaussianBlur(src, dst, Size(5, 5), 0, 0, 4);


3、中值濾波

src = imread("C:\\Users\\934554314\\Desktop\\src.jpg", 1);

medianblur(src,dst,5);

4、雙邊模糊函式bilateralFilter

//! smooths the image using bilateral filter
CV_EXPORTS_W void bilateralFilter( InputArray src, OutputArray dst, int d,
                                   double sigmaColor, double sigmaSpace,
                                   int borderType=BORDER_DEFAULT );

d表示雙邊濾波時候中心到周邊畫素的距離,

sigmacolor表示高斯核中顏色值標準方差

sigmaspace表示高斯核中空間的標準方差

Type一般為預設值4;

src = imread("C:\\Users\\934554314\\Desktop\\src.jpg", 1);

bilaterlFilter(src,dst,15,120,10,4);

5、濾波函式filter2D

CV_EXPORTS_W void filter2D( InputArray src, OutputArray dst, int ddepth,
                            InputArray kernel, Point anchor=Point(-1,-1),
                            double delta=0, int borderType=BORDER_DEFAULT );

d表示輸出影象的深度,-1表示跟輸入影象深度相同

kernel表示自定義的Mat物件,卷積核或者運算元,

Point表示錨定的位置。預設為Point(-1,-1);

delta表示卷積處理之後的每個畫素是否加上常量delta,一般預設為0;

Type一般為預設值4;

//影象的模糊

 int ksize = 15;
 Mat kernel = Mat::ones(ksize, ksize, CV_32F) / (float)(ksize*ksize);
 filter2D(src, dst, -1, kernel, Point(-1, -1), 0.0, 4);

//影象的邊緣提取

 Mat kernel1 = (Mat_<char>(3, 3) << -1, -1, -1, -1, 8,-1, -1, -1, -1);
 filter2D(src, dst, -1, kernel1, Point(-1, -1), 0.0, 4);


//影象的銳化

 Mat kernel1 = (Mat_<char>(3, 3) << -1, -1, -1, -1, 9,-1, -1, -1, -1);
 filter2D(src, dst, -1, kernel1, Point(-1, -1), 0.0, 4);


//robot運算元

 Mat kernel1 = (Mat_<char>(2, 2) << -1,0,0,1);
 filter2D(src, dst, -1, kernel1, Point(-1, -1), 0.0, 4);


//sobel運算元

  Mat kernel1 = (Mat_<char>(3,3) << 1,2,1,0,0,0,-1,-2,-1);
 filter2D(src, dst, -1, kernel1, Point(-1, -1), 0.0, 4);