OpenCV 4.11.0
开源计算机视觉库
加载中…
搜索中…
无匹配项
形态学变换

目标

理论

形态学变换是一些基于图像形状的简单运算。它通常在二值图像上执行。它需要两个输入,一个是我们的原始图像,另一个称为结构元素内核,它决定运算的性质。两个基本的形态学运算符是腐蚀和膨胀。然后是它的变体形式,如开运算、闭运算、梯度等。我们将借助下图逐一查看它们

图像

1. 腐蚀

腐蚀的基本思想就像土壤侵蚀一样,它侵蚀掉前景对象的边界(始终尝试将前景保持为白色)。那么它做了什么?内核在图像上滑动(如在二维卷积中)。只有当内核下的所有像素都为 1 时,原始图像中的像素(1 或 0)才会被认为是 1,否则它会被腐蚀(设置为零)。

因此,发生的情况是,所有靠近边界的像素都会根据内核的大小被丢弃。因此,前景对象或图像中白色区域的厚度或大小减小。它对于去除小的白色噪点(正如我们在颜色空间章节中看到的那样)、分离两个连接的对象等非常有用。

我们使用函数:cv.erode (src, dst, kernel, anchor = new cv.Point(-1, -1), iterations = 1, borderType = cv.BORDER_CONSTANT, borderValue = cv.morphologyDefaultBorderValue())

参数
src输入图像;通道数可以是任意的,但深度应为 cv.CV_8U、cv.CV_16U、cv.CV_16S、cv.CV_32F 或 cv.CV_64F 之一。
dst与 src 大小和类型相同的输出图像。
kernel用于腐蚀的结构元素。
anchor锚点在元素中的位置;默认值 new cv.Point(-1, -1) 表示锚点位于元素中心。
iterations应用腐蚀的次数。
borderType像素外推方法(参见 cv.BorderTypes)。
borderValue常数边界情况下的边界值

试一试

2. 膨胀

它与腐蚀恰好相反。在这里,如果内核下至少有一个像素为“1”,则像素元素为“1”。因此它增加了图像中的白色区域或前景对象的大小增加。通常,在诸如噪声去除的情况下,腐蚀后跟膨胀。因为,腐蚀去除了白色噪声,但它也缩小了我们的对象。所以我们对其进行膨胀。由于噪声消失了,它们不会回来,但我们的物体面积增加了。它也用于连接对象的断裂部分。

我们使用函数:cv.dilate (src, dst, kernel, anchor = new cv.Point(-1, -1), iterations = 1, borderType = cv.BORDER_CONSTANT, borderValue = cv.morphologyDefaultBorderValue())

参数
src输入图像;通道数可以是任意的,但深度应为 cv.CV_8U、cv.CV_16U、cv.CV_16S、cv.CV_32F 或 cv.CV_64F 之一。
dst与 src 大小和类型相同的输出图像。
kernel用于膨胀的结构元素。
anchor锚点在元素中的位置;默认值 new cv.Point(-1, -1) 表示锚点位于元素中心。
iterations应用膨胀的次数。
borderType像素外推方法(参见 cv.BorderTypes)。
borderValue常数边界情况下的边界值

试一试

3. 开运算

开运算只是先腐蚀后膨胀的另一种说法。它对于去除噪声非常有用。

我们使用函数:cv.morphologyEx (src, dst, op, kernel, anchor = new cv.Point(-1, -1), iterations = 1, borderType = cv.BORDER_CONSTANT, borderValue = cv.morphologyDefaultBorderValue())

参数
src源图像。通道数可以是任意的。深度应为 cv.CV_8U、cv.CV_16U、cv.CV_16S、cv.CV_32F 或 cv.CV_64F 之一
dst与源图像大小和类型相同的目标图像。
op形态学运算的类型,(参见 cv.MorphTypes)。
kernel结构元素。可以使用 cv.getStructuringElement 创建。
anchor带内核的锚点位置。负值表示锚点位于内核中心。
iterations应用膨胀的次数。
borderType像素外推方法(参见 cv.BorderTypes)。
borderValue常数边界情况下的边界值。默认值具有特殊含义。

试一试

4. 闭运算

闭运算是开运算的逆运算,先膨胀后腐蚀。它对于闭合前景对象内部的小孔或对象上的小黑点很有用。

试一试

5. 形态学梯度

它是图像膨胀和腐蚀之间的差异。

结果将类似于物体的轮廓。

尝试一下

6. 礼帽

它是输入图像与其开运算结果之间的差值。

尝试一下

7. 黑帽

它是输入图像的闭运算结果与输入图像之间的差值。

尝试一下

结构元素

在之前的例子中,我们借助cv.Mat.ones手动创建了结构元素。它呈矩形。但在某些情况下,您可能需要椭圆形/圆形的内核。为此,OpenCV 提供了一个函数,cv.getStructuringElement()。您只需传入内核的形状和大小,即可获得所需的内核。

我们使用函数:cv.getStructuringElement (shape, ksize, anchor = new cv.Point(-1, -1))

参数
shape元素形状,可以是cv.MorphShapes 中的一种
ksize结构元素的大小。
anchor元素内的锚点位置。默认值 [−1,−1] 表示锚点位于中心。请注意,只有十字形元素的形状取决于锚点位置。在其他情况下,锚点仅调节形态学运算结果的偏移量。

尝试一下