opencv学习笔记6 图像平滑处理cvSmooth

函数原理:

CVAPI(void) cvSmooth( const CvArr* src, CvArr* dst,
                      int smoothtype CV_DEFAULT(CV_GAUSSIAN),
                      int size1 CV_DEFAULT(3),
                      int size2 CV_DEFAULT(0),
                      double sigma1 CV_DEFAULT(0),
                      double sigma2 CV_DEFAULT(0));

参数1:const CvArr* src:处理的源图片;

参数2:const CvArr* dst:处理后的输出图片;

注解:

(1)对于CvArr这一结构,我们可以将其看做C++中的基类,当然也包括IplImage

(2)smooth支持的类型:

CV_BLUR 简单模糊 对每个像素param1,param2求和,并缩放1/(param1*param2),亦即求简单平均值

CV_BLUR_NO_SCALE 简单无缩放变化的模糊 对每个像素param1,param2求和 特别说明的是输入图像和结果图像必须有不同的数值精度,以保证不会发生溢出,如果源图像是8u,则结果图像必须是16s或者32s

CV_MEDIAN 中值模糊 取中心像素的正方形领域类的每个像素的值用中间值代替

CV_GAUSSIAN 高斯模糊 param3为零时,高斯卷积核sigma通过以下公式计算

sigma(x) = (n(x)/2-1)*0.30+0.80,n(x)= param1

sigma(y) = (n(y)/2-1)*0.30+0.80,n(y)= param2

如果第四个参数指定,则第三个和第四个参数分别表示sigma的水平方向和垂直方向的值

如果第三个,第四个参数已经指定,而前两个参数为0,那么窗口的尺寸由sigma确定

速度较慢但最有效

CV_BILATERAL 双向滤波 因为高斯模糊是在图像在空间内的像素是缓慢变化的,但随机的两个点可能形成很大的

像素差,高斯滤波在保留信号的条件下减少噪声,但在接近边缘的地方无效,双向滤波可以解决这个问题,但需要更多的时间代价,

其需要两个参数,param1表示空域中所使用的高斯核的宽度,param2表示颜色域高斯核的高度


从这两幅图片对比可看出,使用3*3模板大小进行中值滤波后的结果已相当不错。

以下是附出的代码:


#include<cv.h>
#include<highgui.h>
void main()
{
	IplImage* imageIn;
	cvNamedWindow("imageIn", CV_WINDOW_AUTOSIZE);
	cvNamedWindow("imageOut", CV_WINDOW_AUTOSIZE);
	
	imageIn = cvLoadImage("E:\\f\\图像处理图片\\椒盐噪声.jpg");
	cvShowImage("imageIn", imageIn);
	IplImage* imageOut = cvCreateImage(cvGetSize(imageIn), IPL_DEPTH_8U, 3);
	cvSmooth(imageIn, imageOut, CV_MEDIAN, 3, 3);
	cvShowImage("imageOut", imageOut);
	cvSaveImage("E:\\f\\图像处理图片\\afterMedian.jpg", imageOut);
	cvWaitKey(0);
	cvReleaseImage(&imageIn);
	cvReleaseImage(&imageOut);
	cvDestroyAllWindows();
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值