OpenCV滤波器

本文介绍了OpenCV中的几种滤波器,包括中值滤波器,如medianBlur函数,用于处理噪声图像;方框滤波器,如blur和boxFilter函数,实现像素平均值计算;以及邻域滤波和卷积操作。这些滤波技术在图像处理中有着广泛应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

中值滤波器

函数:void medianBlur( InputArray src, OutputArray dst, int ksize );

参数:

src:输入图像

dst:输出结果

ksize:尺寸

说明:中值滤波一般不会用的最大值与最小值,在处理salt点图像时可以体现其效果


方框滤波器

函数:blur( InputArray src, OutputArray dst,
                        Size ksize, Point anchor=Point(-1,-1),
                        int borderType=BORDER_DEFAULT );

参数:

src :输入图像

dst:输出结果

ksize:核矩阵尺寸

使用的是均值方法,像素的值取自周围像素值得平均值,blur是boxFilter()的标准化(blur内部以标准的形式调用boxFilter())


函数:void boxFilter( InputArray src, OutputArray dst, int ddepth,
                             Size ksize, Point anchor=Point(-1,-1),
                             bool normalize=true,
                             int borderType=BORDER_DEFAULT );

这里 blur 和 boxFilter 的区别是,blur是标准化后的 boxFilter,即boxFilter的核函数:
其中,

邻域滤波(卷积)

函数:

void filter2D( InputArray src, OutputArray dst, int ddepth,
                            InputArray kernel, Point anchor=Point(-1,-1),
                            double delta=0, int borderType=BORDER_DEFAULT );
使用方法:
cv::Mat filter_2D ;
	cv::Mat ker(3 , 3 , CV_32F , cv::Scalar(0)) ;
	ker.at<float>(1 , 1) = 5.0f ;
	ker.at<float>(0,1) = -1.0;
	ker.at<float>(1,0) = -1.0;
	ker.at<float>(1,2) = -1.0;
	ker.at<float>(2,1) = -1.0;
	cv::filter2D(image , filter_2D ,image.depth() , ker) ;
	cv::imshow("filter_2D" , filter_2D) ;

相当于中间像素值得五倍减去上下左右四个像素的值,然后结果赋值为中间那个像素。

高斯滤波器
函数:
void GaussianBlur( InputArray src,
                                               OutputArray dst, Size ksize,
                                               double sigmaX, double sigmaY=0,
                                               int borderType=BORDER_DEFAULT );
参数:
ksize:核矩阵的尺寸
sigmax,sigmay:高斯函数中的参数
说明:
高斯滤波器是一类根据高斯函数的形状来选择权值的线性平滑滤波器。它对去除服从正态分布的噪声很有效。
常用的零均值离散高斯滤波器函数:

2D图像中表示为:

方向滤波器:
函数:void Sobel( InputArray src, OutputArray dst, int ddepth,
                         int dx, int dy, int ksize=3,
                         double scale=1, double delta=0,
                         int borderType=BORDER_DEFAULT );
参数:
ddepth:数据类型
dx , dy:X ,Y 轴方向
delta:偏移量
说明:在X,Y方向的滤波器
代码:
cv::Mat sobelX ;
	cv::Sobel(image , sobelX , CV_8U , 1 , 0 , 3 , 0.4 , 128) ;
	cv::imshow("sobelX" , sobelX) ;//滤去水平的,垂直的痕迹很清晰
	cv::Mat sobelY ;
	cv::Sobel(image , sobelY , CV_8U , 0 , 1 , 3 , 0.4 , 128) ;	
	cv::imshow("sobelY" , sobelY) ;//滤去垂直的,水平的痕迹很清晰

	cv::Mat sobel ;
	cv::Sobel(image , sobelX , CV_16S , 1 , 0) ;
	cv::Sobel(image , sobelY , CV_16S , 0 , 1) ;
	sobel = abs(sobelX) + abs(sobelY) ;
	cv::imshow("sobel" , sobel) ;

	double sobmin , sobmax ;
	cv::minMaxLoc(sobel , &sobmin , &sobmax) ;
	cv::Mat sobelImage ;
	sobel.convertTo(sobelImage , CV_8U , -255. / sobmax , 255) ;
	cv::imshow("sobelImage" , sobelImage) ;

	cv::Mat sobelThresholded ;
	cv::threshold(sobelImage , sobelThresholded ,200 , 255 , cv::THRESH_BINARY) ;
	cv::imshow("sobelThresholded" , sobelThresholded) ;

	cv::Sobel(image , sobelX , CV_32F , 1 , 0) ;
	cv::Sobel(image , sobelY , CV_32F , 0 , 1) ;
	cv::Mat norm ,dir ;
	cv::cartToPolar(sobelX , sobelY , norm , dir) ;

拉普拉斯高通滤波器:
cv::Mat computeLaplacian(const cv::Mat & image)
	{
		cv::Laplacian(image , laplace , CV_32F , aperture) ;
		img = image.clone() ;

		return laplace ;
	}

	cv::Mat getLaplacianImage(double scale = -1.0)
	{
		if(scale < 0)
		{
			double lapmin , lapmax ;
			cv::minMaxLoc(laplace , &lapmin  , &lapmax) ;
			scale = 127 / std::max(-lapmin , lapmax ) ;
		}
		cv::Mat laplaceImage ;
		laplace.convertTo(laplaceImage , CV_8U , scale , 128) ;
		return laplaceImage ;
	}




参考: http://blog.csdn.net/xiaowei_cqu/article/details/7785365
           http://blog.csdn.net/thefutureisour/article/details/7574900(sobel 和 LapLace高通滤波器)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值