【问题标题】:Algorithm for making straight lines out of bumpy pixels用凹凸像素制作直线的算法
【发布时间】:2012-09-30 00:52:23
【问题描述】:

问题

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

我的目标

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

我的解决方案尝试

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

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

我的问题

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

【问题讨论】:

  • en.wikipedia.org/wiki/Ramer–Douglas–Peucker_algorithm
  • 感谢您的快速回复。我会检查并报告情况。
  • @MartinBeckett 这正是我所需要的。您应该回答问题而不是发表评论,以便我可以将其标记为答案:)。否则我会在你之后标记另一个回答它的人。再次感谢!
  • 这是一个很棒的算法,每个人最终都会在需要逼近一条线时重新发明它!
  • @MartinBeckett 你打算为此创建一个答案吗?我不是想烦人,我只是想确保你得到分数,因为你是第一个回答的。如果您不在乎,我只会支持您的评论并标记工作的答案。

标签: algorithm image-processing signal-processing


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 当我有机会回来报告时,我也会检查一下。感谢您的快速回复!
  • 当然。如果您没有太多时间,那么en.wikipedia.org/wiki/Simple_regression 中给出的计算 beta 和 alpha 的公式对您来说就可以了。
  • Ramer-Douglas-Peucker 算法效果很好,我没有尝试过。仍然感谢您的回复。
  • 不用担心。我自己并不知道这个算法,它确实似乎让你更接近你所追求的。
【解决方案2】:

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
相关资源
最近更新 更多