首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >填充形状的内部

填充形状的内部
EN

Stack Overflow用户
提问于 2020-03-06 19:18:44
回答 1查看 137关注 0票数 1

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

它们被表示为简单的numpy数组,0表示空,任何其他值表示非空。

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-06 21:55:20

您可以使用scipy.ndimage.binary_fill_holes来实现此目的:

代码语言:javascript
复制
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。如果你想这样,可能会更复杂一点……如果你没有一个形状在另一个形状里面的情况,也许这是可行的:

代码语言:javascript
复制
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]]

仍然有一些复杂的案例。例如,输入:

代码语言:javascript
复制
1 1 1
1 0 2
2 2 2

将在第一个代码段中生成所有1,而在第二个代码段中不做任何更改。根据您的确切需求,您可以根据需要调整代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60563032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档