【问题标题】:Fill the interior of shapes填充形状的内部
【发布时间】:2020-06-19 03:04:31
【问题描述】:

我正在处理一个我处理很多形状的问题,例如:

这些表示为简单的 numpy 数组,其中 0 表示空,任何其他值表示非空。

我需要填充内部空间为空的形状,例如上面的两个正方形。 但我还没有想出任何简单的解决方案。

对软件包有什么想法或建议吗?

【问题讨论】:

  • 这似乎是检测和填充边界框的问题。这可能会有所帮助stackoverflow.com/questions/54638817/…
  • 您绝对可以看到这样的问题。虽然,我认为更直接的方法是填充边界框之外的所有空值,然后如果剩下任何空值,它们就是形状的内部。我看过你引用的帖子,但我没有想到如何在这个问题中使用它,你的想法是什么?
  • scipy.ndimage.binary_fill_holes 可能会有所帮助,但如果你有不同的数字来表示不同的形状,并且你想让它们分开,你可能需要遍历形状 ID 或其他东西。
  • fill 是什么意思?你想要什么而不是 0 ?你在寻找什么样的连续性?例如在第一个图中右上角的洞?
  • @jdehesa 这正是我所需要的!太棒了,谢谢你的帮助。你不想让它成为答案吗?

标签: python numpy geometry


【解决方案1】:

您可以为此使用scipy.ndimage.binary_fill_holes

import scipy

a = np.array([
    [0, 0, 1, 1, 1],
    [0, 0, 1, 0, 1],
    [0, 0, 1, 1, 1],
    [0, 0, 0, 0, 0],
    [2, 2, 2, 0, 0],
    [2, 0, 2, 0, 0],
    [2, 2, 2, 0, 0],
])
b = scipy.ndimage.binary_fill_holes(a)
print(b.astype(int))
# [[0 0 1 1 1]
#  [0 0 1 1 1]
#  [0 0 1 1 1]
#  [0 0 0 0 0]
#  [1 1 1 0 0]
#  [1 1 1 0 0]
#  [1 1 1 0 0]]

这样做的一个问题是它不保持形状 ID。如果你愿意,它可能会更复杂一些......如果你没有一个形状在另一个形状内的情况,也许这可以工作:

import scipy

a = np.array([
    [0, 0, 1, 1, 1],
    [0, 0, 1, 0, 1],
    [0, 0, 1, 1, 1],
    [0, 0, 0, 0, 0],
    [2, 2, 2, 0, 0],
    [2, 0, 2, 0, 0],
    [2, 2, 2, 0, 0],
])
b = np.zeros_like(a)
for i in range(a.max()):
    shape = i + 1
    b += shape * scipy.ndimage.binary_fill_holes(a == shape)
print(b)
# [[0 0 1 1 1]
#  [0 0 1 1 1]
#  [0 0 1 1 1]
#  [0 0 0 0 0]
#  [2 2 2 0 0]
#  [2 2 2 0 0]
#  [2 2 2 0 0]]

还有一些复杂的案例。例如输入:

1 1 1
1 0 2
2 2 2

将在第一个 sn-p 中产生所有的,而在第二个中没有变化。根据您的具体需要,您可以根据需要调整代码。

【讨论】:

    猜你喜欢
    • 2017-03-12
    • 2015-07-07
    • 2017-01-08
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    相关资源
    最近更新 更多