填充靠近图像区域的元素

Fill the elements close to the region of the image

我有黑白图像,其中有一些白色元素触及图像的边界

我正在尝试用黑色填充这些白色部分(在此图像上只有一个部分,但可以有多个)。我唯一的想法是遍历图像边界上的像素,每当我看到一个白色像素时 运行 递归填充周围白色像素的所有白色像素的算法。

虽然这显然会产生我想要的结果,但我希望有一个更简单的方法来实现这个 numpy/scipy/scikit-image。

在搜索 SO 时,我发现的唯一相关问题是 this。这个问题听起来和我想要的差不多,但实际上解决了另一个问题。有没有希望为我找到一个简单的解决方案?

试一试 scipy.ndimage.label

这是一个草图(未经测试):

labeled_image, _ = scipy.ndimage.label(binarized_image)
for region in np.union1d(labeled_image[[0,-1]].flatten(),
                         labeled_image[:,[0,-1]].flatten()):
    binarized_image[labeled_image == region] = 0

以上代码将图像分割成相同颜色的连接区域。每个都按某种顺序分配一个整数值。 labeled_image[[0, -1]]labeled_image[:, [0, -1]] 分别是图像的顶行和底行,以及图像的左列和右列。 array.flatten() 用于使它们成为 union1d 可用的形状,在此上下文中,它将 return 所有与边界接触的区域标签。我们迭代这些,并在二值化图像中将所有这些区域涂成黑色。

编辑:

对不起我的误会。我认为您正在寻找模块 clear_border.

Clear_border(image) 用黑色(或其他值)填充所有附加到边框的白色区域。

import numpy as np
from skimage import io

from skimage.segmentation import clear_border

image = np.array([[0, 0, 0, 0, 0, 0, 0, 1, 0],
                  [0, 0, 0, 0, 1, 0, 0, 1, 0],
                  [1, 0, 0, 1, 0, 1, 0, 0, 0],
                  [0, 0, 1, 1, 1, 1, 1, 0, 0],
                  [0, 1, 1, 1, 1, 1, 1, 1, 0],
                  [0, 0, 0, 0, 0, 0, 0, 0, 0]])


clear_border(image)

io.imshow(image)
io.show()

更多信息请查看: http://scikit-image.org/docs/0.11.x/api/skimage.segmentation.html#clear-border