skimage.morphology.remove_small_holes 和 skimage.morphology.remove_small_objects 有何不同?

How do skimage.morphology.remove_small_holes and skimage.morphology.remove_small_objects differ?

这两种方法都包含在 Python 的 Scikit-Image 库中。我正在尝试从图像中提取某些对象并将 运行 放入高级开发人员代码中的这两个方法中,为相同目的而编写。

我已经阅读了这两个 skimage.morphology.remove_small_holes and skimage.morphology.remove_small_objects 的文档。但是我不明白这两种方法在包含图像的 ndarray 上 运行 时有什么区别。

一个删除对象(任何其他单个值)内的孔(值 0),另一个删除对象。请注意,它作用于 二进制图像(dtype bool 的 ndarray)或 segmentation masks(dtype int 的 ndarray,其中每个值代表一个对象) .希望这个例子阐明了它们的用途:

import numpy as np
from skimage import morphology

objects = np.array([
        [1, 1, 1, 0, 0],
        [1, 0, 1, 0, 0],
        [1, 1, 1, 0, 0],
        [0, 0, 0, 0, 2],
        ])

你可以看到这个数组有两个对象,对象“1”有 8 个像素,其中有一个大小为 1 像素的孔,而对象“2”总共只有 1 个像素。现在我做:

print(morphology.remove_small_objects(objects, 2))

这将删除大小严格小于 2 像素的对象,因此“2”消失:

[[1 1 1 0 0]
 [1 0 1 0 0]
 [1 1 1 0 0]
 [0 0 0 0 0]]

去除孔稍微复杂一些,因为函数适用于布尔数组,但同样的原理也适用。我们将:

  • 将对象图像转换为binary/boolean
  • 去掉洞
  • 使用 segmentation.watershed 取回对象 — 保留其原始 ID。
from skimage import segmentation

binary_objects = objects.astype(bool)
binary_filled = morphology.remove_small_holes(binary_objects, 2)
objects_filled = segmentation.watershed(
        binary_filled, objects, mask=binary_filled
        )
print(objects_filled)

这会从任何对象中删除大小严格小于 2 的 ,因此删除对象“1”中的孔:

[[1 1 1 0 0]
 [1 1 1 0 0]
 [1 1 1 0 0]
 [0 0 0 0 2]]