本文简单举一个图像平滑滤波的例子,以此认识OpenCV为我们提供的强大图像处理功能。代码如下:
// // main.cpp // Smooth_Filter // // Created by 黄露 on 16/3/21. // Copyright 2016年 huanglu_thu13. All rights reserved. // #include "cv.h" #include "highgui.h" int main(int argc, const char * argv[]) { //创建两个窗口显示处理前后的图片 cvNamedWindow("Imgae Before Processing"); cvNamedWindow("Image After Processing"); //创建图像指针,加载图像至内存 IplImage * in = cvLoadImage("/Users/huanglu/Pictures/thusada.jpg",1); //创建一个图像来存储处理后的图片 IplImage * out = cvCreateImage(cvGetSize(in), IPL_DEPTH_8U, 3); //做平滑滤波,用3×3的模板 cvSmooth(in, out, CV_GAUSSIAN, 3, 3); //显示处理前后的图片 cvShowImage("Imgae Before Processing", in); cvShowImage("Imgae After Processing", out); //释放图像指针 cvReleaseImage(&in); cvReleaseImage(&out); //等待用户输入任意键结束 cvWaitKey(); //释放两个窗口 cvDestroyWindow("Imgae Before Processing"); cvDestroyWindow("Imgae After Processing"); return 0; }
代码中前面一部分已经没什么需要解释的,主要需要解释以下2个函数。
1、cvCreateImage用来创建首地址并分配存储空间,其原型为:
IplImage* cvCreateImage( CvSize size, int depth, int channels );
三个参数依次是图像大小、图像元素的位深度和图像的通道数。这里我们使用cvGetSize获取图像大小,IPL_DEPTH_8U 表示无符号8位整型,即uint8,本次图像为彩色三通道。
2、cvSmooth可使用简单模糊、简单无缩放变换的模糊、中值模糊、高斯模糊、双边滤波的任何一种方法平滑图像。其声明为:
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 (双向滤波) - 应用核大小为param1×param1的滤波,彩色sigma=param3,空间 sigma=param4。
以下是测试的结果:
时间: 2024-07-30 16:04:47