OpenCV 4.11.0
开源计算机视觉库
|
形态学变换是一些基于图像形状的简单运算。它通常在二值图像上执行。它需要两个输入,一个是我们的原始图像,另一个称为结构元素或内核,它决定运算的性质。两个基本的形态学运算符是腐蚀和膨胀。然后是它的变体形式,如开运算、闭运算、梯度等。我们将借助下图逐一查看它们
腐蚀的基本思想就像土壤侵蚀一样,它侵蚀掉前景对象的边界(始终尝试将前景保持为白色)。那么它做了什么?内核在图像上滑动(如在二维卷积中)。只有当内核下的所有像素都为 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 | 常数边界情况下的边界值 |
它与腐蚀恰好相反。在这里,如果内核下至少有一个像素为“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 | 常数边界情况下的边界值 |
开运算只是先腐蚀后膨胀的另一种说法。它对于去除噪声非常有用。
我们使用函数: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 | 常数边界情况下的边界值。默认值具有特殊含义。 |
闭运算是开运算的逆运算,先膨胀后腐蚀。它对于闭合前景对象内部的小孔或对象上的小黑点很有用。
它是图像膨胀和腐蚀之间的差异。
结果将类似于物体的轮廓。
它是输入图像与其开运算结果之间的差值。
它是输入图像的闭运算结果与输入图像之间的差值。
在之前的例子中,我们借助cv.Mat.ones手动创建了结构元素。它呈矩形。但在某些情况下,您可能需要椭圆形/圆形的内核。为此,OpenCV 提供了一个函数,cv.getStructuringElement()。您只需传入内核的形状和大小,即可获得所需的内核。
我们使用函数:cv.getStructuringElement (shape, ksize, anchor = new cv.Point(-1, -1))
shape | 元素形状,可以是cv.MorphShapes 中的一种 |
ksize | 结构元素的大小。 |
anchor | 元素内的锚点位置。默认值 [−1,−1] 表示锚点位于中心。请注意,只有十字形元素的形状取决于锚点位置。在其他情况下,锚点仅调节形态学运算结果的偏移量。 |