无法通过remove_small_objects去除噪音

Hon*_*iao 3 python opencv image-processing scikit-image image-morphology

我有一个白色和黑色的图像。我尝试通过 消除噪音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()
Run Code Online (Sandbox Code Playgroud)

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

我做错什么了吗?谢谢

在此输入图像描述

Ton*_*has 8

来自文档(强调我的):

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

移除小于指定尺寸的物体。

期望 ar 是一个带有标记对象的数组,并删除小于 min_size 的对象。如果 ar 为 bool,则首先对图像进行标记。这会导致 bool 和 0-and-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)
Run Code Online (Sandbox Code Playgroud)

阴谋

  • 要点是,如果数组是 bool,则首先对其进行标记。如果是 int,则每个值都被视为不同的对象。在这种情况下,该函数假设小斑点仍然是名为“255”的对象的一部分。除了转换为 bool 之外,您还可以在图像上运行“skimage.measure.label”(或“scipy.ndimage.label”),然后将其用作输入。 (4认同)