“skimage.morphology._pnpoly import points_inside_poly”的更快替代方案?

计算科学 Python 计算几何 scipy
2021-12-11 00:55:55

我正在使用scikit-image'spoints_inside_poly函数,并且在我的代码中我调用它的次数足够多,它占用了我运行时间的大约 50%(通过分析确定)。

我现在有两个选择:1) 减少我拨打的电话次数points_inside_poly和/或 2) 找到(或拨打?)更快的points_inside_poly.

虽然我正在探索 1),但目前对我来说解决方案并不明显,因此需要更多的思考。同时,我想知道是否有任何速度更快的替代品points_inside_poly

1个回答

skimage 的功能是检查点左侧的水平射线是否与多边形的每个边相交。如果交叉数是奇数,则在内部,如果是偶数,则在外部。skimage 的实现也相当高效:前段时间,作为一个学习练习,我将 skimage 重新实现points_inside_polygon为一个 numpy gufunc,见这里,我认为它的运行速度比 skimage 的实现快 2 倍。没什么好写的。

该算法可以很好地检查单个点是否在单个多边形内,但对于其他情况则不是最佳的。特别是,如果给定多边形内有很多点,您可能需要借鉴多边形光栅化的想法。网络上的信息有点分散,但大学课程中或多或少有几张完整的幻灯片,请参阅. 您可能希望使用扫描线算法,首先按 y 坐标对多边形顶点进行排序,然后按顺序扫描它们,更新与当前 y 坐标交叉的多边形顶点列表。要检查具有 y 坐标 y0 的点是否在多边形内,您将计算该 y 坐标处活动顶点的交点,按 x 坐标对它们进行排序,并检查您的点 x 坐标是否落在内部或外部段中.

skimage 算法,对于n多边形中的点m顶点,将是一个O(mn)算法。我之后描述的那个需要对点和顶点进行排序,所以O(nlogn+mlogm),但在那之后,每点的工作量与在该 y 坐标处交叉的边数成正比,这将小于m对于大多数多边形。

所以基本上,它高度依赖于你的点和多边形的确切特征,但答案很可能是:是的,有更好的方法。