之前的时候,为了过滤图像中的一些噪点,学过一些简单的滤波,好比中值滤波,均值滤波,也是本身实现的。函数
在opencv中有现成的函数能够调用,实现滤波的操做。学习
函数的原型以下:ui
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));
前两个参数是输出图像的指针,目标图像的指针;spa
第三个参数是传入一个值,表示如今滤波的方式;指针
最后四个值通常用来表示模板的大小code
平滑类型 | 名称 | 支持 | 输入数据类型 | 输出数据类型 | 简要说明 | |
CV_BLURblog |
简单模糊 | 对每一个像素点作size1*size2模板的求和sum,在ret=sum/(size1*size2) | ||||
CV_BLUR_NO_SCALE图片 |
简单无缩放变化的模糊 | 对每一个像素点作size1*size2模板的求和sum,ret=sum | ||||
CV_MEDIAN | 中值模糊 | 对图像进行size1*size2模板的取中位数,ret=中位数 | ||||
CV_GAUSSIAN | 高斯模糊 | 是一种加权平均的过程,若使用3×3模板,则计算公式以下g(x,y)={f(x-1,y-1)+f(x-1,y+1)+f(x+1,y-1)+f(x+1,y+1)+[f(x-1,y)+f(x,y-1)+f(x+1,y)+f(x,y+1)]*2+f(x,y)*4}/16; | ||||
CV_BILATERAL | 双边滤波 |
对双边滤波了解的很少,下篇在细讲下= =内存
函数的使用方法:原型
#include "stdafx.h" #include "cv.h" #include "highgui.h" int main(){ IplImage *img= cvLoadImage("C:/lv2.jpg");//读取图片 cvNamedWindow("Example1",CV_WINDOW_AUTOSIZE); cvNamedWindow("Example2",CV_WINDOW_AUTOSIZE); cvNamedWindow("Example3",CV_WINDOW_AUTOSIZE); cvNamedWindow("Example4",CV_WINDOW_AUTOSIZE); cvNamedWindow("Example5",CV_WINDOW_AUTOSIZE); cvNamedWindow("Example6",CV_WINDOW_AUTOSIZE); cvShowImage("Example1",img);//在Example1显示图片 // cvCopy(img,temp); IplImage* temp=cvCreateImage( //建立一个size为image,三通道8位的彩色图 cvGetSize(img), IPL_DEPTH_8U, 3 ); cvSmooth(img,temp,CV_BLUR,3,3);//简单模糊 cvShowImage("Example2",temp); cvSmooth(img,temp,CV_BLUR_NO_SCALE,3,3);//简单无缩放变化的模糊 cvShowImage("Example3",temp); cvSmooth(img,temp,CV_MEDIAN,3,3);//中值模糊 cvShowImage("Example4",temp); cvSmooth(img,temp,CV_GAUSSIAN,3,3);//高斯模糊 cvShowImage("Example5",temp); cvSmooth(img,temp,CV_BILATERAL,1,150,240,480);//双边滤波 cvShowImage("Example6",temp); cvWaitKey(0);//暂停用于显示图片 cvReleaseImage(&img);//释放img所指向的内存空间而且 cvDestroyWindow("Example1"); cvDestroyWindow("Example2"); cvDestroyWindow("Example3"); cvDestroyWindow("Example4"); cvDestroyWindow("Example5"); cvDestroyWindow("Example6"); return 0; }
参考:学习opencv