学习膨胀与腐蚀
形态学操作
- 图像形态学操作-基于形状的一系列图像处理操作的合集,主要是基于集合论基础上的形态学数学
- 形态学有四个基本操作:腐蚀(erode)、膨胀(dilate) 、开(open)、闭(close)
- 膨胀与腐蚀是图像处理中最常用的形态学操作手段
一、膨胀与腐蚀的功能
-
消除噪声
-
分割(isolate)出独立的图像元素,在图像中连接(join)相邻的元素。
-
寻找图像中的明显的极大值区域或极小值区域
-
求出图像的梯度
腐蚀和膨胀是对白色部分(高亮部分)而言的,不是黑色部分。膨胀就是图像中的高亮部分进行膨胀,“领域扩张”,效果图拥有比原图更大的高亮区域。腐蚀就是原图中的高亮部分被腐蚀,“领域被蚕食”,效果图拥有比原图更小的高亮区域。
二、膨胀
跟卷积操作类似,假设有图像A和结构元素B,结构元素B在A上面移动,其中B定义其中心为锚点,计算B覆盖下A的最大像素值用来替换锚点的像素,其中B作为结构体可以是任意形状
void dilate( src,dst,kernel );
三、侵蚀
void erode( src, dst, kernel );
腐蚀跟膨胀操作的过程类似,唯一不同的是以最小值替换锚点重叠下图像的像素值。
四、API
getStructuringElement(int shape, Size ksize, Point anchor)
用于获取结构元素
内含三个参数
- 形状(MORPH_RECT \MORPH_CROSS \MORPH_ELLIPSE)
矩形 MORPH_RECT;
交叉形 MORPH_CROSS;
椭圆形 MORPH_ELLIPSE - 内核的尺寸
- 锚点的位置,默认是Point(-1,-1)意思就是中心像素
我们一般在调用erode以及dilate函数之前,先定义一个Mat类型的变量来获得getStructuringElement函数的返回值。
kernel: 腐蚀操作的内核,即结构元素。 如果不指定,默认为一个简单的 3x3 矩阵。否则,我们就要明确指定它的形状,可以使用函数getStructuringElement
getStructuringElement函数相关的调用示例代码如下:
int g_nStructElementSize = 3; //结构元素(内核矩阵)的尺寸
//获取自定义核
Mat element = getStructuringElement(MORPH_RECT,
Size(2*g_nStructElementSize+1,2*g_nStructElementSize+1),
Point( g_nStructElementSize, g_nStructElementSize ));
调用这样之后,我们便可以在接下来调用erode或dilate函数时,第三个参数填保存了getStructuringElement返回值的Mat类型变量。对应于我们上面的示例,就是填element变量。
五、动态调整结构元素大小
createTrackbar();
相关
计算机视觉(二)-opencv之createTrackbar()详解
六、代码
//-----------------------------------【程序说明】----------------------------------------------
// 程序名称::《【OpenCV入门教程之十】形态学图像处理(一):膨胀与腐蚀 》 博文配套源码