您的位置:首页 > 运维架构

OpenCV滤波器

2014-02-22 12:36 253 查看
中值滤波器

函数: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 ;
	}


参考:/article/1357510.html

http://blog.csdn.net/thefutureisour/article/details/7574900(sobel 和 LapLace高通滤波器)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: