gpt4 book ai didi

python - 如何从位于数组顶部的多边形内的 NumPy 二维数组中提取值?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:42:39 24 4
gpt4 key购买 nike

我的目标如下:给定一个二维数组和一个可以放在数组顶部的多边形,我想提取多边形内的值(包括边界)并对这些值求和。

假设我有一个这样的二维数组:

1 6 8 4 2 3
5 4 1 3 7 9
1 0 2 3 4 8
6 7 0 5 7 4
0 1 2 5 4 2

假设我有一个具有以下顶点的多边形:

(1, 2)
(2, 3)
(3, 3)
(4, 2)
(4, 1)
(3, 1)
(2, 1)
(1, 2)

将多边形放置在数组顶部会产生以下结果:

_ _ _ _ _ _
_ _ 1 _ _ _
_ 0 2 3 _ _
_ 7 0 5 _ _
_ 1 2 _ _ _

最后,我想对这些值求和。所以最终输出将是 21。

最有效的方法是什么?我已经看到对 matplotlib.path 和 Shapely 的引用,但我还没有找到任何适合我需要的东西,除非我只是遗漏了一些东西(这当然是可能的)。看起来这个功能应该内置到 NumPy 中,但我还没有遇到过它。

为什么我需要这个:我有一个代表全局人口的 ASCII 网格,并且我有政治边界。我想在人口网格上叠加政治边界以确定该位置的总人口数。

最佳答案

涉及的步骤-

  • 创建一个与图像数组形状相同的 bool 数组。

  • 使用给定的轮廓点填充轮廓。

  • 通过填充轮廓点形成的孔来创建多边形 Blob 。

  • 使用填充掩码对图像数组进行 bool 索引并获得总和。

实现-

from scipy.ndimage.morphology import binary_fill_holes as imfill

mask = np.zeros(img.shape,dtype=bool)
mask[idx[:,0], idx[:,1]] = 1
out = img[imfill(mask)].sum()

sample 运行-

1) 输入图像和多边形轮廓点:

In [107]: img
Out[107]:
array([[1, 6, 8, 4, 2, 3],
[5, 4, 1, 3, 7, 9],
[1, 0, 2, 3, 4, 8],
[6, 7, 0, 5, 7, 4],
[0, 1, 2, 5, 4, 2]])

In [108]: idx
Out[108]:
array([[1, 2],
[2, 3],
[3, 3],
[4, 2],
[4, 1],
[3, 1],
[2, 1],
[1, 2]])

2) 提议的代码:

In [109]: mask = np.zeros(img.shape,dtype=bool)
...: mask[idx[:,0], idx[:,1]] = 1
...: out = img[imfill(mask)].sum()
...:

3) 分析结果:

In [134]: imfill(mask) # Polygon mask
Out[134]:
array([[False, False, False, False, False, False],
[False, False, True, False, False, False],
[False, True, True, True, False, False],
[False, True, True, True, False, False],
[False, True, True, False, False, False]], dtype=bool)

In [135]: img[imfill(mask)]
Out[135]: array([1, 0, 2, 3, 7, 0, 5, 1, 2])

In [136]: img[imfill(mask)].sum()
Out[136]: 21

关于python - 如何从位于数组顶部的多边形内的 NumPy 二维数组中提取值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42821711/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com