形态学操作就是基于形状的一系列图像处理操作。OpenCV为进行图像的形态学变换提供了快捷、方便的函数。最基本的形态学操作有二种,他们是:膨胀与腐蚀(Dilation与Erosion)
膨胀:此操作将图像(A)与任意形状的内核 (B),通常为正方形或圆形,进行卷积。内核 B 有一个可定义的 锚点, 通常定义为内核中心点。进行膨胀操作时,将内核 B 划过图像,将内核 B 覆盖区域的最大相素值提取,并代替锚点位置的相素。显然,这一最大化操作将会导致图像中的亮区开始”扩展” (因此有了术语膨胀 dilation )。这种操作会造成图像中像素值高的区域变大,而像素值小的区域变小。(感官上图像变细,变白了)
腐蚀:跟膨胀操作造作的效果刚好相反。腐蚀在形态学操作家族里是膨胀操作的孪生姐妹。它提取的是内核覆盖下的相素最小值。进行腐蚀操作时,将内核 B 划过图像,将内核 B 覆盖区域的最小相素值提取,并代替锚点位置的相素。以与膨胀相同的图像作为样本,我们使用腐蚀操作。从下面的结果图我们看到亮区变细,而黑色区域则变大了。(感官上图像变粗,变黑了)
膨胀与腐蚀能实现多种多样的功能,主要如下:
- 消除噪声
- 分割(isolate)出独立的图像元素,在图像中连接(join)相邻的元素。
- 寻找图像中的明显的极大值区域或极小值区域
- 列表内容
- 求出图像的梯度
形态学膨胀——dilate函数
void dilate(
InputArray src,//输入图像,即源图像,填Mat类的对象即可。
OutputArray dst,//即目标图像,需要和源图片有一样的尺寸和类型
InputArray kernel,//膨胀操作的核。若为NULL时,表示的是使用参考点位于中心3x3的核
Point anchor=Point(-1,-1),//锚的位置,其有默认值(-1,-1),表示锚位于中心。
int iterations=1,//迭代使用erode()函数的次数,默认值为1
int borderType=BORDER_CONSTANT,//用于推断图像外部像素的某种边界模式。注意它有默认值BORDER_DEFAULT
const Scalar& borderValue=morphologyDefaultBorderValue() //一般我们不用去管他
);
getStructuringElement(
//第一个参数表示内核的形状,矩形: MORPH_RECT,交叉形: MORPH_CROSS,椭圆形: MORPH_ELLIPSE
//第二和第三个参数分别是内核的尺寸以及锚点的位置,有默认值Point(-1,-1),表示锚点位于中心
)
形态学腐蚀——erode函数
void erode(
InputArray src,
OutputArray dst,
InputArray kernel,
Point anchor=Point(-1,-1),
int iterations=1,
int borderType=BORDER_CONSTANT,
const Scalar& borderValue=morphologyDefaultBorderValue()
);
代码:
#include <opencv2/opencv.hpp>
#include<iostream>