用凹凸像素制作直线的算法

时间:2012-10-09 16:21:10

标签: algorithm image-processing signal-processing

问题

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

我的目标

理顺线条(如果可能)并尽量减少borderPoints的数量(尽可能多)。我目前的用例是房屋的屋顶,所以在大多数情况下,我希望我能找到角落,只使用那些作为borderPoints而不是其间的所有变化点。但由于凹凸不平的像素线,我无法弄清楚如何找到这些角落。

我尝试解决方案

一种简单的技术是循环检查之前的点,当前点和之后的点。如果之前的点和之后的点具有相同的x或相同的y,则可以移除当前点。这会使点数减少一点,但不会像我想的那样多。

我还尝试查看前后点以查看当前点是否可以在某个斜率范围内被删除但是没有成功,因为偶尔会删除一个关键角点,因为图像有点像模糊,角落略微圆点。

我的问题

有没有算法来做这类事情?如果是这样,它们被称为什么?如果没有,有关如何解决这个问题的任何想法?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

在我看来,你正在寻找1度的多项式近似。

要快速回答您的问题,您可能需要阅读:http://en.wikipedia.org/wiki/Simple_regression。数值示例部分具体说明了如何计算线的等式。

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

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

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

在算法方面,您可能希望特别关注Chebyshev近似和Remez算法。所有这些都用任意度的多项式求解函数的逼近,但在你的情况下,你只关心1度。