腐蚀和膨胀是对二维图片的进行操作的形态学运算,简单来讲形态学操作就是基于形状的一系列图像处理操作,通过将结构元素作用于输入图像来产生输出图像。腐蚀(Erosion)和膨胀(Dilation)是最基本的形态学操作,他们运用广泛主要有:
. 消除噪声
. 分割(ioslate)独立的图像元素以及连接(join)相邻的元素
. 寻找图像中的明显的极大值区域或极小值区域
. 求出图像的梯度
给出图片如下:
图片背景为白色,字母为黑色。下面将根据此图形对膨胀腐蚀的原理进行说明。
1.膨胀
膨胀(dilate)就是求局部最大值的操作,从数学的角度来讲膨胀或者腐蚀就是将一幅二维图像或图像的一部分(称之为A)与一个模板也就是核(称为B)进行卷集运算的过程。
核可以是任何形状和大小,与之前介绍的模板一样,核有一个可定义的锚点。
. 膨胀操作是将图像A与任意形状的内核B(通常为正方形或者圆形)进行卷集
. 内核B中可定义的锚点通称定义为内核中心点
. 进行膨胀操作时,将内核B在图像A上进行滑动操作,将内核B覆盖的区域的最大像素值提取并提到内核B锚点位置的像素。
. 上述操作将会导致图像中的亮区开始扩展,因为白色的像素值要远远大于黑色的像素值。经膨胀运算后其图形如下
对于膨胀运算其数学表达式如下:
opencv提供了dilate函数来实现膨胀操作,其原型如下
C++: void dilate(InputArray src, OutputArray dst, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue() )
参数解释如下:
. InputArray src: 输入图像,可以是Mat类型,对于图像通道数量没有要求,但是图像深度应为CV_8U、CV_16U、CV_16s、CV_32F或CV_64F其中之一。
. OutputArray dst: 输出图像,与原图像有相同的尺寸和类型。
. InpurArray kernel: 用于膨胀操作的kernel,当参数=Mat()即NULL时,kernel是一个锚点位于中心的3x3模板。可以通过getStructuringElement函数来制定kernel的形状和尺寸,其函数原型如下:
Mat cv::getStructuringElement ( int shape,
Size ksize,
Point anchor = Point(-1,-1