关键函数:
关键函数:
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
-
平滑方法:
- CV_BLUR_NO_SCALE (简单不带尺度变换的模糊) - 对每个象素的 param1×param2 领域求和。如果邻域大小是变化的,可以事先利用函数 cvIntegral 计算积分图像。
- CV_BLUR (simple blur) - 对每个象素param1×param2邻域 求和并做尺度变换 1/(param1•param2).
- CV_GAUSSIAN (gaussian blur) - 对图像进行核大小为 param1×param2 的高斯卷积
- CV_MEDIAN (median blur) - 对图像进行核大小为param1×param1 的中值滤波 (i.e. 邻域是方的).
- CV_BILATERAL (双向滤波) - 应用双向 3x3 滤波,彩色 sigma=param1,空间 sigma=param2. 关于双向滤波,可参考http://www.dai.ed.ac.uk/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filtering.html
-
param1
- 平滑操作的第一个参数. param2
- 平滑操作的第二个参数. 对于简单/非尺度变换的高斯模糊的情况,如果param2的值 为零,则表示其被设定为param1。
如下是代码:
#include "cv.h"
#include "highgui.h"
#include "cxcore.h"
int param1=1;
int param2=1;
IplImage *img,*dst;
void switch_callback(int position)
{
int m_param1=param1*2+1;
int m_param2=param2*2+1;
cvSmooth(img,dst,CV_GAUSSIAN,param1,param2);
cvShowImage("Smooth Demo",dst);
}
int main(int argc,char* argv[])
{
IplImage *image=cvLoadImage(argv[1]);
img=image;
cvNamedWindow("Smooth Demo",1);
cvCreateTrackbar("Param1","Smooth Demo",¶m1,99,switch_callback);
cvCreateTrackbar("Param2","Smooth Demo",¶m2,99,switch_callback);
dst=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,3);
while(1)
{
if(cvWaitKey(15)==27)
break;
}
cvReleaseImage(&img);
cvReleaseImage(&dst);
cvReleaseImage(&image);
cvDestroyWindow("Smooth Demo");
}
效果如下: