以前的时候,为了过滤图像中的一些噪点,学过一些简单的滤波,比如中值滤波,均值滤波,也是自己实现的。
在opencv中有现成的函数可以调用,实现滤波的操作。
函数的原型如下:
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));
前两个参数是输出图像的指针,目标图像的指针;
第三个参数是传入一个值,表示现在滤波的方式;
最后四个值一般用来表示模板的大小
平滑类型 | 名称 | 支持 | 输入数据类型 | 输出数据类型 | 简要说明 | |
CV_BLUR | 简单模糊 | 对每个像素点做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 "cv.h"
#include "highgui.h"
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char* argv[])
{
Mat src = imread("misaka.jpg");
Mat dst;
//参数是按顺序写的
//高斯滤波
//src:输入图像
//dst:输出图像
//Size(5,5)模板大小,为奇数
//x方向方差
//Y方向方差
GaussianBlur(src,dst,Size(5,5),0,0);
imwrite("gauss.jpg",dst);
//中值滤波
//src:输入图像
//dst::输出图像
//模板宽度,为奇数
medianBlur(src,dst,3);
imwrite("med.jpg",dst);
//均值滤波
//src:输入图像
//dst:输出图像
//模板大小
//Point(-1,-1):被平滑点位置,为负值取核中心
blur(src,dst,Size(3,3),Point(-1,-1));
imwrite("mean.jpg",dst);
//双边滤波
//src:输入图像
//dst:输入图像
//滤波模板半径
//颜色空间标准差
//坐标空间标准差
bilateralFilter(src,dst,5,10.0,2.0);//这里滤波没什么效果,不明白
imwrite("bil.jpg",dst);
waitKey();
return 0;
}
#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