opencv学习--(3)滤波总结

/*

最大值滤波可以去除图像中的暗斑,同时也会使亮斑增大;最小值滤波可以去除图像中的亮斑,同时也会增大暗斑

滤波处理分为两大类:线性滤波和非线性滤波。
OpenCV里有这些滤波的函数,使用起来非常方便,现在简单介绍其使用方法。

线性滤波:方框滤波、均值滤波、高斯滤波
			均值滤波:均值滤波就是方框滤波的一个特殊情况。
					均值滤波的缺点就是不能很好地保护细节,在图像去燥的同时也破坏了图像的而细节部分,
					从而使图像变得模糊,不能很好的去除噪点。

			高斯滤波:高斯滤波,可以消除高斯噪声,广泛应用于图像处理的减噪过程。(高斯滤波的模糊感明显比均值更低)

非线性滤波:中值滤波、双边滤波
			中值滤波:(中值滤波跟均值滤波的思想看起来很相似,只是一个取平均值,一个取中位数而已,
						均值滤波中噪声成分会被加入到平均计算,所以输出是受到噪声的影响的。但是中值滤波中,
						由于噪声成分很难选上,所以基本不影响输出。当然好的性能也需要付出一点代价的,
						中值滤波花费的时间是均值滤波的5倍以上。中值滤波一般采用奇数的卷积核,
						中值滤波对一些细节多(特别是细、尖顶的)的图像不太适合。)
						基本思想就是用像素点的领域灰度的中值来代替该像素点的灰度值,
						该方法在去除脉冲噪声、椒盐噪声的同时又能保留图像的细节(不会出现边缘模糊的情况)。
			双边滤波:双边滤波的最大特点就是做边缘保存。
*/
#include<opencv.hpp>
#include<highgui.hpp>
#include<imgproc.hpp>
using namespace std;
using namespace cv;
void main()
{
	
	/*方框滤波*/
	/*
	IplImage *img = cvLoadImage("jack1.jpg");
	Mat src = cvarrToMat(img);
	Mat out;
	//方框滤波的参数解释
	//第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。该函数对通道是独立处理的,且可以处理任意通道数的图片,但需要注意,待处理的图片深度应该为CV_8U, CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
	//第二个参数,OutputArray类型的dst,即目标图像,需要和源图片有一样的尺寸和类型。
	//第三个参数,int类型的ddepth,输出图像的深度, - 1代表使用原图深度,即src.depth()。
	//第四个参数,Size类型(对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,我们一般不去管它。
	boxFilter(src,out,-1,Size(10,10));
	imshow("out",out);
	*/
	//--------------------------------------------------


	/*均值滤波*/
	/*
	Mat img = imread("jack1.jpg");
	Mat out;
	blur(img,out,Size(5,5));
	*/
	//--------------------------------------------------
	/*g高斯滤波*/
	/*
	Mat img = imread("jack1.jpg");
	Mat out;
	GaussianBlur(img,out,Size(1,1),0,0);
	//GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT);
	//src,输入图像,即源图像,填Mat类的对象即可。它可以是单独的任意通道数的图片,但需要注意,图片深度应该为CV_8U, CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
	//dst,即目标图像,需要和源图片有一样的尺寸和类型。比如可以用Mat::Clone,以源图片为模板,来初始化得到如假包换的目标图。
	//ksize,高斯内核的大小。其中ksize.width和ksize.height可以不同,但他们都必须为正数和奇数(并不能理解)。或者,它们可以是零的,它们都是由sigma计算而来。
	//sigmaX,表示高斯核函数在X方向的的标准偏差。
	//sigmaY,表示高斯核函数在Y方向的的标准偏差。若sigmaY为零,就将它设为sigmaX,如果sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height计算出来。
	//为了结果的正确性着想,最好是把第三个参数Size,第四个参数sigmaX和第五个参数sigmaY全部指定到。
	//borderType,用于推断图像外部像素的某种边界模式。注意它有默认值BORDER_DEFAULT。
	*/

	//--------------------------------------------------
	/*g中值滤波*/
	/*
	Mat img = imread("jack1.jpg");
	Mat out;
	medianBlur(img,out,7);//第三个参数表示孔径的线性尺寸,它的值必须是大于1的奇数
	*/

	//--------------------------------------------------
	/*双边滤波----结合图像的空间邻近度和像素值相似度的一种折衷处理,
				同时考虑空间与信息和灰度相似性,达到保边去噪的目的,
				具有简单、非迭代、局部处理的特点*/
	Mat img = imread("jack1.jpg");
	Mat out;
	bilateralFilter(img,out,25,25*2,25/2);
	/*
	 InputArray src: 输入图像,可以是Mat类型,图像必须是8位或浮点型单通道、三通道的图像。 
	. OutputArray dst: 输出图像,和原图像有相同的尺寸和类型。 
	. int d: 表示在过滤过程中每个像素邻域的直径范围。如果这个值是非正数,则函数会从第五个参数sigmaSpace计算该值。 
	. double sigmaColor: 颜色空间过滤器的sigma值,这个参数的值越大,表明该像素邻域内有越宽广的颜色会被混合到一起,产生较大的半相等颜色区域。 
	. double sigmaSpace: 坐标空间中滤波器的sigma值,如果该值较大,则意味着颜色相近的较远的像素将相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。当d>0时,d指定了邻域大小且与sigmaSpace五官,否则d正比于sigmaSpace. 
	. int borderType=BORDER_DEFAULT: 用于推断图像外部像素的某种边界模式,有默认值BORDER_DEFAULT.
	*/

	imshow("out",out);
	waitKey(0);
	return;
}

我的opencv系列博客都是受Madcola博主启发,感谢博客园的Madcola博主!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值