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;

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