2

我想拟合一条线到线的片段,即大约属于该线的少量(通常少于 10 个)线段。这条线有一个小坡度。但也有异常值:线外的段(通常更小)。下图是一个典型案例。碎片之间没有水平重叠。

在此处输入图像描述

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

有什么建议吗?


更新

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

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

4

2 回答 2

1

我猜斜率将大约是线片段斜率的平均值乘以等于片段长度的因子(或片段长度的平方,取决于外围片段的长度如何比较)。然后将该线与该斜率最佳拟合。

所以取线片段,将斜率转换为角度(arctan2(y1-y0,x1-x0))乘以长度将它们全部加起来,除以(所有片段的总长度)。对位置(线片段的中点位置*片段长度)/(所有片段的总长度)执行相同的操作,然后确保具有该斜率的线与具有该值的点相交。

更新:

如果我们不考虑太多关于坡度的问题,我们宁愿在位置上对线进行最佳拟合,以考虑我们再次按其长度加权的各个部分的影响。

求片段的总长度。迭代片段,直到达到片段总长度的 1/3。这将是你的第一个点的 x。然后选择一些任意小的值并再次遍历片段,以您选择的速率进行采样。然后,该样本的影响是给定的 y 乘以 x 的线性距离,从 x 的 1/3 到通过所有片段的所有片段均由所有片段的线性距离的总和归一化。对 2/3 的方式做同样的事情。并在两个结果点之间画一条线。

于 2016-04-17T21:29:29.497 回答
1

正如你所问,我有一些建议。完整且有效的答案对我来说有点太多了。我的建议包含两个主要部分。一一拿下:


处理异常值:

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

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

重新对齐你的线条,使它们主要平行于 X 轴,然后,正如我上面提到的,找到包含大部分线条的条纹。


近似最佳拟合线:

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

  • 求所有点到这条线的距离,当点在线上方时距离为负,当点在线下方时距离为正。
  • 将所有距离相加。我们称这个总和值为approximationError
  • 您现在的目标是找到approximationError为 0 的 y 值。
  • 如果多数点位于该线下方,则减少 y,如果多数点位于该线上方,则增加它。
  • 你最终会到达像y = c.
  • 现在,将这条线倾斜到您在主成分分析步骤中更改所有输入线段的角度。
  • 要获得线段,请通过条纹中两个 x 最远点的 x 值切割这条线。

我意识到这一切可能并不容易想象。这是PCA 的维基百科图像的链接。这是另一个演示线路致密化的答案的链接。

于 2016-04-18T00:59:36.143 回答