OpenCV - 三种线性滤波的使用

一、方框滤波

方框滤波(box Filter)被封装在一个名为boxblur的函数中,即boxblur函数的作用是使用方框滤波器(box filter)来模糊一张图片。函数原型为:

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

参数详解:
第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可
第二个参数,OutputArray类型的dst,即目标图像,需要和源图片有一样的尺寸和类型。
第三个参数,int类型的ddepth,输出图像的深度,-1代表使用原图深度,即src.depth()。
第四个参数,Size类型的ksize,内核的大小(Size(w,h),w 为像素宽度, h为像素高度)
第五个参数,Point类型的anchor,表示锚点(即被平滑的那个点),注意他有默认值Point(-1,-1)
第六个参数,bool类型的normalize,默认值为true,表示内核是否被其区域归一化(normalized)了

第七个参数,int类型的borderType,用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT


二、均值滤波

均值滤波,是最简单的一种滤波操作,输出图像的每一个像素是核窗口内输入图像对应像素的像素的平均值( 所有像素加权系数相等),其实说白了它就是归一化后的方框滤波。函数原型为:(参数含义与方框滤波相同)

void blur(InputArray src, OutputArraydst, Size ksize, Point anchor = 
         Point(-1,-1), int borderType = BORDER_DEFAULT)


三、高斯滤波

高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。函数原型为:(除第四五个参数不同之外其余与方框滤波相同,因此只详细说明第四五个参数)

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

参数详解:

第四个参数,double类型的sigmaX,表示高斯核函数在X方向的的标准偏差。
第五个参数,double类型的sigmaY,表示高斯核函数在Y方向的的标准偏差。若sigmaY为零,就将它设为sigmaX,如果sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height计算出来。


运行调用三种线性滤波函数的代码以及运行后效果图如下:

#include <iostream>    
#include <vector>    
#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;

#define WinDow_0 "【原图】"
#define WinDow_1 "方框滤波"
#define WinDow_2 "均值滤波"
#define WinDow_3 "高斯滤波"

int main()
{
	Mat img = imread("D:\\PhotoMem\\3.jpg");
	if (!img.data)
	{
		printf("图片读入路径有误!");
		return -1;
	}
	imshow(WinDow_0, img);
	Mat src_boxblur, src_blur, src_gaussianblur;

	/*
	参数img为输入的图像参数
	参数src_boxblur, src_blur, src_gaussianblur分别为不同滤波输出的图像参数
	参数Size(x,y)为内核大小
	*/

	//方框滤波//
	boxFilter(img, src_boxblur, -1, Size(5, 5));//-1为输出图像的深度(-1表示与原图像相同)
	imshow(WinDow_1, src_boxblur);

	//均值滤波//
	blur(img, src_blur, Size(5, 5));
	imshow(WinDow_2, src_blur);

	//高斯滤波//
	GaussianBlur(img, src_gaussianblur, Size(5, 5), 0, 0);//第4,5个参数的0,0分别表示高斯核函数在X,Y方向的标准偏差
	imshow(WinDow_3, src_gaussianblur);
	waitKey(0);
}
运行效果比对图:


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