【问题标题】:Fill the elements close to the region of the image填充靠近图像区域的元素
【发布时间】:2016-05-12 05:06:42
【问题描述】:

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

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

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

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

【问题讨论】:

  • contours 的概念可以很容易地解决你的问题,你可以使用 opencv 吗?因为我不确定 scipy 或 numpy 是否有用于在给定图像中查找轮廓的 API。
  • @ZdaR 我可以随意使用我想要的任何东西。问题是我对 OpenCV 不是很熟悉。但如果你能提供一个很好的解释,我将非常感激。
  • 您的输入图像周围也有白色边框?因为在这种情况下,首先您还需要裁剪图像并移除该边框?
  • @ZdaR 是的,有时我拥有它(并非总是如此,也不是来自所有方面)。如果我要使用我的递归方法,它不会有任何区别,但我想在你的情况下它确实如此。
  • 你有关于每边边框宽度的信息吗?

标签: python numpy scipy scikit-image


【解决方案1】:

试一试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 可用的形状,在这种情况下,它将返回与边界接触的所有区域标签。我们对这些区域进行迭代,并将二值化图像中的所有这些区域涂成黑色。

【讨论】:

  • 我用label获得了我的原始图像。这将如何帮助我了解哪些标记区域与边界相连?
  • 我的原始答案中有一些语法错误。 label 不应该给你原始图像,除非图像只有两个区域,相反它应该是每个连接区域中的不同整数。 uinion1d 及其参数为您提供了一个数组,其中包含连接到边界的区域的标签。
【解决方案2】:

编辑:

对不起,我的误解。我认为您正在寻找模块 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

【讨论】:

  • 对不起,我的误解,我已经添加了您可能正在寻找的模块 clear_border 的信息。
  • 是的,是的,还有一次是的。这正是我所需要的。谢谢。
  • 感谢第二次机会 ;-)
猜你喜欢
  • 1970-01-01
  • 2018-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多