![]() |
OpenCV 4.12.0
开源计算机视觉
|
形态学转换是一些基于图像形状的简单操作。它通常在二值图像上进行。它需要两个输入,一个是原始图像,第二个被称为结构元素或内核,它决定了操作的性质。两个基本的形态学算子是腐蚀和膨胀。然后,它的变体形式,如开运算、闭运算、梯度等也会发挥作用。我们将借助以下图像逐一了解它们
腐蚀的基本思想就像土壤侵蚀一样,它会侵蚀前景对象的边界(始终尝试将前景保持为白色)。那么它是如何工作的呢?内核在图像上滑动(如在 2D 卷积中)。只有当内核下的所有像素都为 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] 表示锚点位于中心。请注意,只有十字形元素的形状取决于锚点位置。在其他情况下,锚点只会调节形态学运算的结果移动多少。 |