首页 > 代码库 > 膨胀和腐蚀 - cvErode 和 cvDilate 函数实现

膨胀和腐蚀 - cvErode 和 cvDilate 函数实现

前言

  膨胀就是对图中的每个像素取其核范围内最大的那个值,腐蚀就相反。这两个操作常用来突出显示图的某个高亮部分或者昏暗部分以及去噪。本文展示两个分别对图像进行膨胀和腐蚀的例子。

膨胀和腐蚀函数 cvErode 和 cvDilate

  函数原型:

 1 // 膨胀函数
 2 void cvcvDilate (
 3     IplImage *src,    // 待处理图像
 4     IplImage dst,    // 处理后图像
 5     IplConvKernel * B = NULL,    // 自定义卷积核
 6     int iterations = 1    // 是否进行迭代
 7 );
 8 
 9 // 腐蚀函数
10 void cvErode (
11     IplImage *src,    // 待处理图像
12     IplImage dst,    // 处理后图像
13     IplConvKernel * B = NULL,    // 自定义卷积核
14     int iterations = 1    // 是否进行迭代
15 );

  一般来说,后面两个参数用的不多,就用它的默认参数好了。

代码示例 - 膨胀

 1 // 此头文件包含图像IO函数的声明
 2 #include "highgui.h"
 3  // 此头文件包含基本的图像处理函数和高级计算机视觉算法
 4 #include "cv.h"
 5 
 6 int main (void) {
 7 
 8     // 将D盘目录下名为" 1.jpg "的图像加载至内存并获得一个指向该图像内存块的指针img
 9     IplImage * img = cvLoadImage ("D:\\1.jpg");
10 
11     // 创建一个窗口显示平滑处理前的图像
12     cvNamedWindow ("膨胀前", CV_WINDOW_AUTOSIZE);
13 
14     // 将图像装载进窗口并显示此窗口
15     cvShowImage ("膨胀前", img);
16 
17     // 创建一个新的图像内存块,以存放平滑结果。
18     IplImage * out = cvCreateImage (
19         cvGetSize (img),
20         img->depth,
21         img->nChannels
22     );
23 
24     // 膨胀函数
25     cvDilate (
26         img,    // 输入图像
27         out        // 输出图像
28     );
29 
30     // 创建一个窗口显示平滑处理后的图像
31     cvNamedWindow ("膨胀后", CV_WINDOW_AUTOSIZE);
32 
33     // 将图像装载进窗口并显示此窗口
34     cvShowImage ("膨胀后", out);
35 
36     // 该函数的参数为 0 时,程序将等待用户触发一个按键操作。
37     // 若参数为正整数,则程序将暂停该整数个毫秒单位直至用户有任何按键。
38     cvWaitKey (0);
39 
40     // 释放图像内存块
41     cvReleaseImage (&img);
42     cvReleaseImage (&out);
43 
44     // 关闭窗口同时释放窗口内存块
45     cvDestroyWindow ("膨胀前");
46     cvDestroyWindow ("膨胀后");
47 
48     return 0;
49 }

运行结果

  

代码示例 - 腐蚀

 1 // 此头文件包含图像IO函数的声明
 2 #include "highgui.h"
 3  // 此头文件包含基本的图像处理函数和高级计算机视觉算法
 4 #include "cv.h"
 5 
 6 int main (void) {
 7 
 8     // 将D盘目录下名为" 1.jpg "的图像加载至内存并获得一个指向该图像内存块的指针img
 9     IplImage * img = cvLoadImage ("D:\\1.jpg");
10 
11     // 创建一个窗口显示平滑处理前的图像
12     cvNamedWindow ("腐蚀前", CV_WINDOW_AUTOSIZE);
13 
14     // 将图像装载进窗口并显示此窗口
15     cvShowImage ("腐蚀前", img);
16 
17     // 创建一个新的图像内存块,以存放平滑结果。
18     IplImage * out = cvCreateImage (
19         cvGetSize (img),
20         img->depth,
21         img->nChannels
22     );
23 
24     // 腐蚀函数
25     cvErode (
26         img,    // 输入图像
27         out        // 输出图像
28     );
29 
30     // 创建一个窗口显示平滑处理后的图像
31     cvNamedWindow ("腐蚀后", CV_WINDOW_AUTOSIZE);
32 
33     // 将图像装载进窗口并显示此窗口
34     cvShowImage ("腐蚀后", out);
35 
36     // 该函数的参数为 0 时,程序将等待用户触发一个按键操作。
37     // 若参数为正整数,则程序将暂停该整数个毫秒单位直至用户有任何按键。
38     cvWaitKey (0);
39 
40     // 释放图像内存块
41     cvReleaseImage (&img);
42     cvReleaseImage (&out);
43 
44     // 关闭窗口同时释放窗口内存块
45     cvDestroyWindow ("膨胀前");
46     cvDestroyWindow ("膨胀后");
47 
48     return 0;
49 }

运行结果