1、形态学概述
形态学操作就是基于形状的一系列图像处理操作。OpenCV为进行图像的形态学变换提供了快捷、方便的函数。最基本的形态学操作有二种,他们是:膨胀与腐蚀(Dilation与Erosion)。
主要功能如下:
- 消除噪声
- 分割(isolate)出独立的图像元素,在图像中连接(join)相邻的元素。
- 寻找图像中的明显的极大值区域或极小值区域
- 求出图像的梯度
膨胀就是图像中的高亮部分(白色部分)进行膨胀,“领域扩张”,效果图拥有比原图更大的高亮区域。腐蚀就是原图中的高亮部分被腐蚀,“领域被蚕食”,效果图拥有比原图更小的高亮区域。
2、膨胀
膨胀或者腐蚀操作就是将图像(或图像的一部分区域,我们称之为A)与核(我们称之为B,锚点)进行卷积。
核通常是一个小的中间带有参考点的实心正方形或圆盘。
膨胀就是求局部最大值的操作,计算核B覆盖的区域的像素点的最大值,并把这个最大值赋值给参考点指定的像素。这样就会使图像中的高亮区域逐渐增长。
就是用核B的参考点与高亮区域每个点重合,如果核B存在一部分在图形内,就把当前参考点所在的点当成一个边界点,所以图形会膨胀。
opencv中函数原型为:
CV_EXPORTS_W void dilate(
InputArray src,
OutputArray dst,
InputArray kernel,
Point anchor=Point(-1,-1),
int iterations=1,
int borderType=BORDER_CONSTANT,
const Scalar& borderValue=morphologyDefaultBorderValue()
);
第一个参数为输入图像,第二个参数为目标图像,第三个参数为膨胀的核,一般用getStructuringElement返回指定形状和尺寸的结构元素,getStructuringElement的三个参数分别为内核的形状,尺寸和锚点的位置,第四个参数为锚的位置,第五个参数为迭代使用erode()函数的次数,默认值为1,第六七个参数不用管。
调用实例:
//载入原图
Mat image = imread("1.jpg");
//获取自定义核
Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
Mat out;
//进行膨胀操作
dilate(image, out, element);
3、腐蚀
腐蚀和膨胀相反,必须要全部在图形里才算有效点。
腐蚀函数:
CV_EXPORTS_W void erode(
InputArray src,
OutputArray dst,
InputArray kernel,
Point anchor=Point(-1,-1),
int iterations=1,
int borderType=BORDER_CONSTANT,
const Scalar& borderValue=morphologyDefaultBorderValue()
);
同膨胀。
调用实例:
//载入原图
Mat image = imread("1.jpg");
//获取自定义核
Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
Mat out;
//进行腐蚀操作
erode(image,out, element);