图像的平滑处理

平滑处理即模糊处理,平滑的用途有很多,最常见的是用来减少图像上的噪声或者失真。

openCV提供的平滑的操作有五种,所有操作由函数cvsmooth实现。

void cvSmooth(

const CvArr* src,

CvArr* dst,

int smoothtype=CV_GAUSSIAN,

int param1=3,

int param2=0,

int param3=0,

int param4=0,

);

cvSmooth包括4个参数:param1,param2,param3,param4,这些参数的含义取决于smoothType的值。smoothType五种类型:CV_BLUR(简单模糊),CV_BLUR_NO_SCALE(简单无缩放变换的模糊),CV_MEDIUM(中值模糊),CV_GAUSSIAN(高斯模糊),CV_BILATERAL(双边滤波)。

简单模糊输出的图像的每一个像素是窗口中对应输入图像的简单平均值;简单无缩放变换的模糊原则上与简单模糊没有区别,但是并没有计算平均值的操作,因此输入图像和结果图像必须有不同的数值精度,才能保证模糊操作不会导致错误溢出,因此不是所有模糊操作输入和输出图像的类型都是相同的。

中值滤波器是将中心像素的正方形领域内的每个像素值用中间像素值(不是平均值)替换;高斯滤波器虽然不是最快的,但是它是最有用的滤波器,高斯滤波用卷积核与输入图像的每个点进行卷积,将最终的结果之和作为输出图像的像素值。(核的大小为param1*param2)前两个参数代表滤波器窗口的宽度和高度。

双边滤波器与高斯滤波器不同,高斯滤波器会磨平边缘,而双边滤波器能够提供一种不会将边缘平滑掉的方法,但是做为代价,需要更多的处理时间。双边滤波器有两个参数,第一个参数代表空域中高斯核的宽度,第二个参数代表颜色域内高斯核的宽度,第二个参数越大表明待滤波的强度(或颜色范围)越大,因此不连续的程度越高。 #include "cv.h" #include "highgui.h"

int main(int argc,char** argv) {cvNamedWindow("1",1); IplImage* img=cvLoadImage("lena.jpg"); cvShowImage("1",img);

IplImage* img1=cvCreateImage(cvGetSize(img),8,3); cvSmooth(img,img1,CV_GAUSSIAN,5,3); cvNamedWindow("2",1); cvShowImage("2",img1);

while (1) {if (cvWaitKey(100)==27) break; }

cvDestroyWindow("1"); cvDestroyWindow("2"); cvReleaseImage(&img); cvReleaseImage(&img1); return 0; }

posted on 2013-07-21 11:40  Freshman11  阅读(788)  评论(0编辑  收藏  举报

导航