无法通过remove_small_objects去除噪声

3

我有一张黑白图片。我试图通过remove_small_objects函数来去除噪点。

import cv2 as cv
import numpy as np
from skimage import morphology

img = np.array([[255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
                [255, 255,   0, 255,   0,   0,   0,   0, 255, 255, 255],
                [255, 255, 255, 255,   0,   0,   0,   0, 255,   0,   0],
                [255, 255,   0,   0,   0,   0,   0,   0,   0,   0,   0],
                [255, 255,   0,   0,   0,   0,   0, 255,   0,   0,   0],
                [255, 255,   0,   0,   0,   0,   0,   0,   0,   0,   0],
                [255, 255, 255,   0,   0,   0,   0,   0,   0,   0,   0],
                [255, 255,   0,   0,   0,   0,   0,   0,   0,   0,   0],
                [255, 255,   0,   0,   0,   0,   0,   0,   0,   0,   0]])

cleaned = morphology.remove_small_objects(img, min_size=10, connectivity=1)
print(cleaned)

while True:
    cv.imshow('Demo', cleaned.astype(np.uint8))
    if cv.waitKey(1) & 0xFF == 27:
        break

cv.destroyAllWindows()

然而,它并没有像我预期的那样工作。中间的白色像素255仍然存在。

我做错了什么吗?谢谢

enter image description here

1个回答

8

文档中(强调是我的):

skimage.morphology.remove_small_objects(ar, min_size=64, connectivity=1, in_place=False)

删除小于指定大小的对象。

期望ar是带标签的对象数组,并删除小于min_size的对象。如果ar是bool型,则首先对图像进行标记。这可能导致布尔型和0-1数组的行为有所不同。

import numpy as np
from skimage import io, morphology
import matplotlib.pyplot as plt

img = np.array([[255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
                [255, 255,   0, 255,   0,   0,   0,   0, 255, 255, 255],
                [255, 255, 255, 255,   0,   0,   0,   0, 255,   0,   0],
                [255, 255,   0,   0,   0,   0,   0,   0,   0,   0,   0],
                [255, 255,   0,   0,   0,   0,   0, 255,   0,   0,   0],
                [255, 255,   0,   0,   0,   0,   0,   0,   0,   0,   0],
                [255, 255, 255,   0,   0,   0,   0,   0,   0,   0,   0],
                [255, 255,   0,   0,   0,   0,   0,   0,   0,   0,   0],
                [255, 255,   0,   0,   0,   0,   0,   0,   0,   0,   0]])

arr = img > 0
cleaned = morphology.remove_small_objects(arr, min_size=2)
cleaned = morphology.remove_small_holes(cleaned, min_size=2)

fig, axs = plt.subplots(1, 2)
axs[0].imshow(img, cmap='gray')
axs[0].set_title('img')
axs[1].imshow(cleaned, cmap='gray')
axs[1].set_title('cleaned')
plt.show(fig)

plot


它可以工作!我在想为什么当ndarray是整数数组时,它不起作用...文档说它可以是“任意形状、整数或布尔类型。包含所需对象的数组。如果数组类型是整数,则整数必须是非负数。” - Hongbo Miao
4
重点是,如果数组是bool类型,它首先被标记。如果是int类型,则将每个值视为不同的对象。在这种情况下,函数假定小斑块仍然是名为“255”的对象的一部分。除了转换为bool之外,您还可以在图像上运行skimage.measure.label(或scipy.ndimage.label),然后将其用作输入。 - Juan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接