您的位置:首页 > 理论基础

OpenCV(三)回归计算机视觉,对图像平滑处理

2016-11-12 10:41 302 查看
#include "cv.h"
#include "highgui.h"

void smooth(IplImage *image){
cvNamedWindow("in",0);
cvNamedWindow("out",0);
cvShowImage("in",image);
IplImage* out =cvCreateImage(cvGetSize(image),IPL_DEPTH_8U,3);
cvSmooth(image,out ,CV_GAUSSIAN, 3, 3,0.0,0.0);
cvShowImage("out",out);
cvReleaseImage(&out);
cvWaitKey(0);
cvDestroyWindow("in");
cvDestroyWindow("out");

}
int main()
{
IplImage* img=cvLoadImage("G:/test.bmp",-1);
smooth(img);
return 0;
}

代码讲解:
IplImage* out =cvCreateImage(cvGetSize(image),IPL_DEPTH_8U,3);
上一篇文章中讲解了cvCreateFileCapture()来为新的帧分配空间。但是cvCreateFileCapture()只分配一帧图像的空间,每次调用时覆盖前面一次的数据(这样每次调用返回的指针是一样的)。那么为了分配自己 的图像结构空间用来存储平滑处理后的图像。第一个参数是一个CvSize结构,这个结构可以通过cvGetSize() 获得;第一个参数说明了当前图像结构的大小。第二个参数告诉我们每个像素点的数据类型,最后一个参数说明了通道的参数。所以当前图像是3个通道(每个通道8位),图像大小为image。
cvSmooth(image,out ,CV_GAUSSIAN, 3, 3,0.0,0.0);
对于OpenCV来说,平滑处理其实就是调用一个库函数那么简单。第一个参数,指定输入的图像;第二个参数,输出图像;光滑操作的方法以及相关一些参数。在本程序中,我们使用每个像素周围3*3区域进行高斯平滑处理。
当然写C程序的好习惯就是你用了编译器的空间,你得给它还回去,就是最后要cvReleaseImage();释放空间。
后话:当然作为搞图像的,我们不能仅仅知道利用cvSmooth()函数能平滑处理。当然我们也要知道,平滑处理是什么?怎么用?
     平滑处理其实是指平滑空间滤波器,概念相当简单,冈萨雷斯是这样定义的:它用滤波掩模确定的领域内像素的平均灰度值去代替图像每个像素点的值。

111
111
111
就像这个三乘三表格,以每一个像素点为中心,累加然后平均就可以得到平滑后每个像素点的值。
那么什么时候会用到平滑处理呐?平滑滤波器用于模糊处理和减小噪声。例如,在提取大的目标之前去除图像中一些琐碎的细节,桥接直线或曲线的缝隙。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息