如何简化样条曲线?

How to simplify a spline?

我正在从事的项目中遇到了一个有趣的算法挑战。我有一个排序的坐标点列表,指向街道两侧的建筑物,充分放大后,看起来像这样:

我想把这条锯齿形曲线平滑化,使底层街道线性化。

我可以想到几个解决方案:

  1. 使用六个左右点的滚动平均值计算质心,并使用它们。
  2. Spline regression.

有没有更好或最好的方法来解决这个问题? (我使用的是 Python 3.5)

根据您的描述和评论,您正在寻找一种行简化算法

Ramer-Doublas 算法(在评论中建议)很可能是这个家族中最 well-known 的算法,但还有更多。

例如Visvalingam’s algorithm works by removing the point with the smallest change, which is calculated by the smallest square of the triangle. This makes it super easy to code and intuitively understandable. If it is hard to read research paper, you can read this简单的文章。

这个系列中的其他算法是:

了解他们,了解他们试图缩小的内容以及select最适合您的内容。

Dali 的 post 正确地推测线简化算法对这项任务很有用。在 post 回答这个问题之前,我实际上检查了一些这样的算法,但对它们不太满意,因为即使它们产生了我喜欢的简化几何形状,它们也没有直接解决我的问题在特征的两侧,从不在中间。

因此我使用了两步过程:

  1. 我通过使用五个周围点坐标的滚动平均值计算折线的质心。这对平滑函数没有太大帮助,但它确实成功地将它们重新映射到街道中间。
  2. 我将 Visvalingam 的算法应用于新折线,指定了 n=20 个点(使用 this 精彩实现)。

结果不是很完美,但已经足够好了:

感谢大家的帮助!