前言
膨胀就是对图中的每个像素取其核范围内最大的那个值,腐蚀就相反。这两个操作常用来突出显示图的某个高亮部分或者昏暗部分以及去噪。本文展示两个分别对图像进行膨胀和腐蚀的例子。
膨胀和腐蚀函数 cvErode() 和 cvDilate()
函数原型:
// 膨胀函数
void cvcvDilate (
IplImage *src, // 待处理图像
IplImage dst, // 处理后图像
IplConvKernel * B = NULL, // 自定义卷积核
int iterations = // 是否进行迭代
); // 腐蚀函数
void cvErode (
IplImage *src, // 待处理图像
IplImage dst, // 处理后图像
IplConvKernel * B = NULL, // 自定义卷积核
int iterations = // 是否进行迭代
);
一般来说,后面两个参数用的不多,就用它的默认参数好了。
代码示例 - 膨胀
// 此头文件包含图像IO函数的声明
#include "highgui.h"
// 此头文件包含基本的图像处理函数和高级计算机视觉算法
#include "cv.h" int main (void) { // 将D盘目录下名为" 1.jpg "的图像加载至内存并获得一个指向该图像内存块的指针img
IplImage * img = cvLoadImage ("D:\\1.jpg"); // 创建一个窗口显示处理前的图像
cvNamedWindow ("膨胀前", CV_WINDOW_AUTOSIZE); // 将图像装载进窗口并显示此窗口
cvShowImage ("膨胀前", img); // 创建一个新的图像内存块,以存放处理后的结果。
IplImage * out = cvCreateImage (
cvGetSize (img),
img->depth,
img->nChannels
); // 膨胀函数
cvDilate (
img, // 输入图像
out // 输出图像
); // 创建一个窗口显示处理后的图像
cvNamedWindow ("膨胀后", CV_WINDOW_AUTOSIZE); // 将图像装载进窗口并显示此窗口
cvShowImage ("膨胀后", out); // 该函数的参数为 0 时,程序将等待用户触发一个按键操作。
// 若参数为正整数,则程序将暂停该整数个毫秒单位直至用户有任何按键。
cvWaitKey (); // 释放图像内存块
cvReleaseImage (&img);
cvReleaseImage (&out); // 关闭窗口同时释放窗口内存块
cvDestroyWindow ("膨胀前");
cvDestroyWindow ("膨胀后"); return ;
}
运行结果
代码示例 - 腐蚀
// 此头文件包含图像IO函数的声明
#include "highgui.h"
// 此头文件包含基本的图像处理函数和高级计算机视觉算法
#include "cv.h" int main (void) { // 将D盘目录下名为" 1.jpg "的图像加载至内存并获得一个指向该图像内存块的指针img
IplImage * img = cvLoadImage ("D:\\1.jpg"); // 创建一个窗口显示处理前的图像
cvNamedWindow ("腐蚀前", CV_WINDOW_AUTOSIZE); // 将图像装载进窗口并显示此窗口
cvShowImage ("腐蚀前", img); // 创建一个新的图像内存块,以存放处理结果。
IplImage * out = cvCreateImage (
cvGetSize (img),
img->depth,
img->nChannels
); // 腐蚀函数
cvErode (
img, // 输入图像
out // 输出图像
); // 创建一个窗口显示处理后的图像
cvNamedWindow ("腐蚀后", CV_WINDOW_AUTOSIZE); // 将图像装载进窗口并显示此窗口
cvShowImage ("腐蚀后", out); // 该函数的参数为 0 时,程序将等待用户触发一个按键操作。
// 若参数为正整数,则程序将暂停该整数个毫秒单位直至用户有任何按键。
cvWaitKey (); // 释放图像内存块
cvReleaseImage (&img);
cvReleaseImage (&out); // 关闭窗口同时释放窗口内存块
cvDestroyWindow ("腐蚀前");
cvDestroyWindow ("腐蚀后"); return ;
}
运行结果
小结
基于这两个操作,能产生诸如开运算,闭运算等更加复杂的运算。
在此不做累述。