图像处理 - 平滑处理(cvSmooth)

“平滑处理”也成为“模糊处理”,是一项简单且使用频率很高的图像处理方法,用图很多,但最常见的是用来减少图像上的噪声或者失真。降低图像分辨率时,平滑处理是很重要的。

目前opencv可以提供5中不同的平滑操作方法,所有操作都有cvsmooth函数实现。

1)简单模糊

利用平均模板,采用领域平均,输出图像是窗口输入图像对应像素的简单平均值。

2)简单无缩放变换的模糊

简单无缩放变换的模糊与简单模糊本质是相同的,但并没有计算其平均值。但不缩放的比缩放的模糊操作更快一些。

3)中值滤波

中值滤波的本质上是一种统计的排序滤波器。对于原图像中某点(i,j),中值滤波以该点为中心的领域内的所有像素的统计排序的中值作为(I,j)的响应,中值不同于均值,是指排序队列中位于中间位置的元素的值,例如:采用3*3中值滤波器,某点的8个领域的一系列像素的值为:1218181123221325118,统计的排序结果为:1112131818222325118,排在中间位置的第518作为中间滤波器的响应。而opencv里讲中心像素的正方形领域内的每个像素值用中间像素值替换。

4)高斯模糊

平均平滑对领域内的像素一视同仁,为了减少平滑处理中的模糊,得到更自然的平滑效果,而高斯模板是适当加大模板中心点的权重,随着远离中心点,权重迅速减小,从而可确保中心点看起来更接近与他距离更近的点。

高斯模板正是将连续的二维高斯离散化表示,因此任意大小的高斯模板可以通过建立一个(2k+1)*(2k+1)的矩阵M得到,其中(i,j)位置元素可如下确定:


5)双边滤波

双边滤波是“边缘保留滤波”的图像分析方法,高斯滤波会磨平边缘,而双边滤波提供一种不会将边缘的平滑掉的方法,但作为代价需要更多的时间。与高斯滤波相似,双边滤波会依据每个像素及其领域构造一个加权平均值,加权计算包括两部分,其中一部分加权方式与高斯平滑中相同,第而部分也属于高斯加权,但不是基于中心像素点与其他像素点空间距离之上的加权,而是基于其他像素与中心像素的亮度差值的加权。


Smooth函数

void cvSmooth( const CvArr* src, 

                         CvArr* dst,

                         int smoothtype=CV_GAUSSIAN, 

                         int param1=3,  

                         int param2=0,  

                         double param3=0 

                         double param4=0 ); 

src

    输入图像。

dst

    输出图像。

smoothtype

    平滑方法。

param1、param2、param3、param4

    这些参数的含义取决于smoothtype的值,有兴趣可以查阅相关资料。

注意:中值滤波主要用来消除椒盐噪声,高斯滤波主要用来消除高斯噪声,自然界一般存在高斯噪声。

/*code*/ 

#include   
#include   
  
int main(int argc, char ** argv)  
{  
    IplImage *src, *dst_blur, *dst_median, *dst_gaussian;  
    src = cvLoadImage( "lena_salt_5.jpg",0 );  
    dst_blur = cvCreateImage( cvGetSize( src ), IPL_DEPTH_8U, 1 );
	dst_median = cvCreateImage( cvGetSize( src ), IPL_DEPTH_8U, 1 );
	dst_gaussian = cvCreateImage( cvGetSize( src ), IPL_DEPTH_8U, 1 );

    cvNamedWindow( "src", 1 );  
    cvNamedWindow( "blur", 1 ); 
    cvNamedWindow( "median", 1 ); 
	cvNamedWindow( "gaussian", 1 ); 

	cvSmooth(src,dst_blur,CV_BLUR,3,3,0,0);			//邻域平均滤波
	cvSmooth(src,dst_median,CV_MEDIAN,3,3,0,0);		//中值滤波 
	cvSmooth(src,dst_gaussian,CV_GAUSSIAN,3,3,0,0);	//高斯滤波

    
	cvShowImage( "src", src ); 
	cvShowImage( "blur", dst_blur );
    cvShowImage( "median", dst_median ); 
	cvShowImage( "gaussian", dst_gaussian );

    cvWaitKey(0);  
    cvReleaseImage( &src );  
    cvReleaseImage( &dst_blur );
	cvReleaseImage( &dst_median );
	cvReleaseImage( &dst_gaussian );
  
    return 0;  
}  

/*result*/

/***源图像***/


/***领域平均***/


/***中值滤波***/


/***高斯滤波***/



你可能感兴趣的:(OpenCV)