我正在尝试用黑色填充这些白色部分(在此图像上只有一个部分,但可能有多个部分)。我唯一的想法是迭代图像边框上的像素,每当我看到一个白色像素运行算法时,递归填充周围白色像素的所有白色像素。
虽然这显然会产生我想要的结果,但我希望有一种更简单的方法来实现这个numpy / scipy / scikit-image。
在搜索SO时,我发现的唯一相关问题是this。问题听起来与我想要的类似,但实际上解决了另一个问题。有没有希望为我找到一个简单的解决方案?
答案 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可用的形状,在此上下文中将返回与边界接触的所有区域标签。我们迭代这些,并在二值化图像中将所有这些区域着色为黑色。