零碎的线条拟合

时间:2016-04-17 20:48:04

标签: algorithm geometry curve-fitting robustness

我想在线条片段上插入一条线,即一小部分(通常少于10个)大致属于该线条的线段。该线有一个小坡度。但是有一些异常值:线外的段(通常更小)。下图显示了典型案例。这些碎片之间没有水平重叠。

enter image description here

我宁愿避免尝试适合所有细分的子集并保持最佳状态。由于样本太小,我也不会依赖RANSAC。

有什么建议吗?

更新

我现在计划将问题重新设计为在点上拟合线,即各个线段上的点的无穷大,假设线性密度恒定。通过以整数形式重写最小二乘方程,可以看出我们可以认为这些段集中在它们的中间,权重等于它们的长度;还有一个额外的术语考虑他们的坡度。这为分段上的拟合提供了良好的接地。

现在我仍然需要加入异常值检测。在RANSAC的启发下,我可以挑选最长的片段并单独或成对使用它们来获得候选线。对于每一行,评估总误差,并保持线给出最小值。从那里,一些标准(尚未找到)应该允许拒绝异常值并在内点上执行最终的最小二乘拟合。

2 个答案:

答案 0 :(得分:1)

我猜测斜率将围绕线片段斜率的平均值乘以等于片段长度的因子(或片段长度的平方,取决于片段长度的长度)相比较)。然后最好的那条线与该斜率。

因此,取线条片段,将斜率转换为角度(arctan2(y1-y0,x1-x0))乘以长度将它们全部加起来,除以(所有片段的总长度)。对位置做同样的事情(线段中点的位置*片段的长度)/(所有片段的总长度),然后确保具有该斜率的线截取具有该值的点。

更新

如果我们不考虑斜坡,我们应该只考虑各个部分的影响,使其在位置方面最合适,我们再次根据它们的长度进行加权。

查找片段的总长度。迭代碎片,直到你到碎片总长度的1/3。那将是你的第一点的x。然后选择一些任意小的值并再次迭代碎片,以您选择的速率进行采样。然后,该样本的影响是给定的y乘以x与通过总片段的x 1/3的线性距离,所有这些都通过所有片段的线性距离的总和进行归一化。对于2/3的方式也一样。并在两个结果点之间画一条线。

答案 1 :(得分:1)

正如你所问,我有一些建议。对我来说,完整而有效的答案对我来说太过分了。我的建议包含两个主要部分。一个接一个地拿走它们:

处理异常值

摆脱异常值的一个建议是对线段进行聚类。然后,不要担心落在群集之外的行。但是,你如何聚集线条?将整个2D平面划分为y = 0 to ay = a to 2ay = 2a to 3a等。属于同一y = i to j条纹的线段将是您用于生成i条带的线段正确条带的1}}和j值。

但是有一个问题:如果线段没有水平分割怎么办?如果多数线倾斜38度而不是接近0怎么办?在这种情况下,您可以执行Principle Component Analysis。很抱歉将您链接到这样一个开放式的想法 - 您的问题有点需要它。

重新排列线条,使它们与X轴主要平行,然后,如上所述,找到包含大部分线条的条纹。

近似最佳拟合线:

现在,在完成正确的条带后,取出条纹中的所有线段并将它们加密。致密化是将线段近似为点集合的步骤。由于所有这些线段都在y = iy = j之间,因此您可以从第y = (i + j) / 2行开始作为最佳拟合线。然后:

  • 找到此线上所有点的距离,当点在线上方时距离为负值,当点在线下方时距离为正值。
  • 总结所有距离。我们称这个求和值为 approximationError
  • 您的目标现在是找到 approximationError 为0的y值。
  • 如果多数积分低于该线,则减少y,如果多数积分高于该线,则增加该值。
  • 您最终会到达y = c
  • 之类的行
  • 现在,将此线倾斜到您在主成分分析步骤中更改所有输入线段的相同角度。
  • 要获取行,请将此行剪切为条带中两个x最远点的x值。

我意识到这一切可能并不容易想象。以下是PCA维基百科图片的link。这是一个link to another answer演示线密集化。

相关问题