Skip to main content
 首页 » 编程设计

python之如何使用纯 Numpy 函数在网格数组上绘制和填充多边形

2025年05月04日11mate10pro

对于 Numpyer 专家来说,这是一个困难的问题!

有人知道或可以想出一种方法来使用纯 Numpy 数组和函数在 numpy 数组网格上绘制和填充彩色多边形吗?

我认为这需要两个步骤:

  1. 能够用颜色值填充网格数组,以便 多边形填充可以用一种颜色书写,轮廓在 另一个。对于这样的系统,什么是理想和最快的,例如 rgb 值、颜色名称字符串等的元组?
  2. 绘制和填充多边形内部的能力 其像素坐标的数组。画出它的轮廓我想 只需使用坐标作为索引应该很容易 网格数组并将它们设置为轮廓颜色值。更多的 困难的是填充多边形。一种方法是迭代 通过所有像素单元坐标(或者更好的是仅针对 每个多边形坐标点的相邻单元格)并测试其是否 坐标在多边形像素坐标内。我知道那里 是一些简单的内外/大于小于算法 使用常规 Python 测试多边形中的点,但出于我的目的 会太慢,我想知道是否有人有 numpy 技能 仅使用速度来设置这样一个高级链接代码 numpy 内置函数在 numpy 像素坐标时返回 True 在多边形内。
  3. 最后,如果有人知道如何在两者之间画一条线 通过填充其间的所有单元格来进行像素/网格/数组坐标 两个具有真值或颜色值的像素?

我知道这是一项艰巨的任务,但我只是想看看是否有人知道。如果是这样,那么这可能会成为一个非常强大且快速的基于 Numpy 的绘图库。最后我想将网格数组保存为图像,通过将其传递给 PIL 很容易。

我知道 PIL 和 Aggdraw 可以绘制多边形,并且在许多类似的帖子中都提到了这一点,但是在接收 xy 多边形/线坐标的 numpy 数组时它们不是很有效。这里的假设是我的多边形坐标已经是 numpy 数组格式,我想避免必须将它们复制到每个绘图的列表中的开销(当我们经常谈论数千个多边形时)。所以这篇文章的不同之处在于如何使用纯 Numpy 填充多边形。

请您参考如下方法:

在这种情况下,实现速度的要点更多的是使用的算法而不是选择的语言。在像素网格上绘制和填充光栅化的多边形属于图像处理算法的领域,AggDraw 肯定使用该领域的算法。

这个想法是,如果您为每个点评估一个考虑多边形矢量性质的函数,您需要执行一些至少为 O(2*p*A) 的操作其中:

  • A = 图片区域
  • p = 多边形周边的平均点数。

相反,如果您对每个点都使用图像处理算法,您可以考虑使用固定且少量的操作。例如,如果您考虑 FloodFill 算法,它的复杂度为 O(A),我可以说它小于 30*A(每个像素大约 30 次操作)。

所以基本上,由于 GADM 多边形有很多顶点,所以最好尽快消除问题的矢量性质,并采用如下方法:

  1. 构建边界像素图
  2. 找到一个内部像素
  3. 使用 Floodfill 算法,无需了解多边形作为矢量实体即可工作

相同的算法肯定可以在 Numpy 中实现,但在使用 Numpy 图形库之前,我建议执行以下操作:

  • 衡量您的代码在各个步骤中花费的时间:
    • Numpy 数组到 AggDraw 列表/序列的转换
    • AggDraw 花费的时间
  • 尝试抽取多边形的顶点,根据当前缩放级别移除留在同一像素中的多边形顶点,看看是否会减少时间