填充靠近图像区域的元素

时间:2016-02-03 06:05:37

标签: python numpy scipy scikit-image

我有黑白图像,其中有一些白色元素触及图像enter image description here的边框。

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

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

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

2 个答案:

答案 0 :(得分:3)

编辑:

对不起我的误会。我想你正在寻找模块clear_border。

Clear_border(图像)用黑色(或其他值)填充连接到边框的所有白色区域。

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

答案 1 :(得分:0)

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可用的形状,在此上下文中将返回与边界接触的所有区域标签。我们迭代这些,并在二值化图像中将所有这些区域着色为黑色。