如何在 python 中有效地找到图形的顶部边界线

How to efficienctly find the top border line of a graph in python

我有一组图表,我想从中找出轮廓图(this图中的黑线。)

不可能找到每个图形在 x 轴上所有点的最大值,因为所有图形的 x 值都不相同。这些点精确到小数点后几位。 this 图表可能有助于更好地理解。

我尝试将每个图形转换为多边形并使用形状 cascaded_union 然后裁剪掉底部。 它适用于少量图形,但当图形数量变大时。这需要很多时间。

还有其他有效的方法吗?

按 x 坐标对所有点进行排序。

您的最终输出将具有有限数量的像素。您可以计算落在每个像素内的 x 值的范围(小范围但不为 0)。因此,将您的积分分成桶。由于它们已经排序,您只需要在列表中前进,直到值属于下一个范围。

对于每个像素列,计算您找到的最大 y 值。在 (x, y) 处为黑线添加一个点。

其复杂度为 o(N logN)。

如果您在 x 轴上有间隙,您可以选择跳过它并在黑线中有间隙,或者简单地在相邻值之间进行插值。如果将黑线绘制为线段的集合,则可以跳过为该列生成点并让渲染器为您进行插值。

如果您的原始点太少(它们会跳过像素),您的线条可能看起来参差不齐(上下跳动)。您可以通过为在该范围内没有点的函数添加插值来避免这种情况。线性插值应该工作得很好。请确保生成尝试在间隔的开始和结束处生成一个点并取较大的 y 值。