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]]
这两种方法都包含在 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]]