首先必须知道几个关键函数——cvLoadImage,cvCreateImage和cvSmooth。
一、主要函数的简单介绍
1.1 cvLoadImage
函数功能:把图片加载到内存中
函数原型:IplImage* cvLoadImage( const char* filename, int flags=CV_LOAD_IMAGE_COLOR );
函数说明:
filename :要被读入的文件的文件名(包括后缀);
flags :指定读入图像的颜色和深度:
指定的颜色可以将输入的图片转为3通道(CV_LOAD_IMAGE_COLOR),单通道 (CV_LOAD_IMAGE_GRAYSCALE), 或者保持不变(CV_LOAD_IMAGE_ANYCOLOR)。
1.2 cvCreateImage
函数功能:创建指定图像结构空间的呃图像
函数原型:IplImage* cvCreateImage(CvSize size, intdepth, intchannels);
函数说明:
第一个参数表示图像的大小。
第二个参数表示图像的深度,可以为IPL_DEPTH_8U,IPL_DEPTH_16U等等。
第三个参数表示图像的通道数。
1.3 cvSmooth
函数功能:对图像做简单的模糊处理
函数原型:void cvSmooth( const CvArr* src, CvArr* dst,int smoothtype=CV_GAUSSIAN,int param1, int param2, double param3, double param4 );
函数说明:
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 的中值滤波 (邻域是方的)。
CV_BILATERAL(双向滤波) - -应用双向 3x3 滤波,彩色 sigma=param1,空间 sigma=param2.。
param1
平滑操作的第一个参数.
param2
平滑操作的第二个参数. 对于简单/非尺度变换的高斯模糊的情况,如果param2的值为零,则表示其被设定为param1。
param3
对应高斯参数的 Gaussian sigma (标准差). 如果为零,则标准差由下面的核尺寸计算:
sigma = (n/2 - 1)*0.3 + 0.8, 其中 n=param1 对应水平核,n=param2 对应垂直核.
对小的卷积核 (3×3 to 7×7) 使用如上公式所示的标准 sigma 速度会快。如果 param3 不为零,而 param1 和 param2 为零,则核大小由sigma 计算 (以保证足够精确的操作).
二、程序代码
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
void smooth(IplImage *image);
int main(int argc, char **argv){
IplImage *img = cvLoadImage(argv[1]);
smooth(img);
}
/*对图像做简单的平滑处理
方法:对传进来的图片每个像素点3*3区域做高斯平滑*/
void smooth(IplImage *image){
cvNamedWindow("Example4-in");//创建两个窗口
cvNamedWindow("Example4-out");
cvShowImage("Example4-in", image);//把加载的图片image在example4-in窗口中显示
IplImage *out = cvCreateImage(//cvCreateImage创建图像结构空间
cvGetSize(image),//大小与传入的图像等大
IPL_DEPTH_8U,//像素点的数据类型
3//当前图像3通道
);
//平滑处理,输入,输出,高斯,3*3
cvSmooth(image,out,CV_GAUSSIAN,3,3);
cvShowImage("Example4-out",out);
cvReleaseImage(&image);//释放内存
cvReleaseImage(&out);
cvWaitKey(0);//等待按键
cvDestroyWindow("Example4-in");//销毁窗口
cvDestroyWindow("Example4-out");
}