3

问题

我有一张从谷歌的静态地图 api 下载的图像。我使用这张图片基本上创建了一个用户点击的“魔杖”类型的功能。对于那些感兴趣的人,我正在使用图形切割算法来查找用户单击的形状。然后,我使用轮廓跟踪找到代表此形状边界的所有点(borderPoints)。

我的目标

拉直线条(如果可能)并尽量减少边界点的数量(尽可能)。我目前的用例是房屋的屋顶,所以在大多数情况下,我希望我能找到角落并将它们用作边界点,而不是中间的所有不同点。但是由于像素线凹凸不平,我无法弄清楚如何找到这些角落。

我的解决方案尝试

一种简单的技术是循环检查之前的点、当前点和之后的点。如果之前的点和之后的点具有相同的 x 或相同的 y,则可以删除当前点。这会稍微减少点数,但没有我想要的那么多。

我还尝试查看之前和之后的点,看看如果当前点不在某个斜率范围内,是否可以删除它,但收效甚微,因为偶尔会删除一个关键角点,因为图像有点模糊,而且角落有略微圆润的点。

我的问题

有没有做这种事情的算法?如果是这样,它(他们)叫什么?如果没有,关于如何以编程方式解决这个问题的任何想法?

4

2 回答 2

3

这听起来类似于Ramer-Douglas-Peucker 算法。通过利用所有点都位于网格上的事实,您可能会做得更好。

于 2012-10-09T17:16:40.303 回答
1

在我看来,您正在寻找 1 次的多项式近似值。

要快速回答您的问题,您可能需要阅读以下内容:http ://en.wikipedia.org/wiki/Simple_regression 。数值示例部分具体向您展示了如何计算您的线的方程。

多项式逼近允许您接近函数、曲线、点组,但是您想使用形式为 an.x^n + ... + a1.x^1 + a0 的多项式函数来调用它

在您的情况下,您需要一条线,因此您需要一个函数 a1.x + a0 ,其中将计算 a1 和 a0 以最小化您拥有的点集的误差。

有多种方法可以计算您的错误(称为规范)并将其最小化。例如,您可能有兴趣找到使与您拥有的任何点的距离最小的线(最小化最大值),或最小化与整个点集的距离(最小化绝对差的总和,或差的平方和等)

在算法方面,您可能需要专门查看 Chebyshev 近似和 Remez 算法。所有这些都解决了具有任意次数多项式的函数的逼近,但在您的情况下,您只关心 1 次。

于 2012-10-09T16:26:28.533 回答