我想要将一条线拟合到线段,即大约属于该线的少量(通常少于 10 个)线段。该线有一个小坡度。但也存在异常值:线外的线段(通常较小)。下图是一个典型案例。各个部分之间没有水平重叠。
我宁愿避免尝试对所有分割子集进行拟合并保持最佳状态。我也不会依赖 RANSAC,因为样本太小。
有什么建议吗?
更新:
我现在计划将问题重新定义为在点上拟合直线的问题,即假设线性密度恒定,即各个线段上的无穷多个点。通过以积分形式重写最小二乘方程,我们可以认为线段集中在中间,权重等于它们的长度;还有一个额外的术语考虑了它们的斜率。这为分段安装提供了良好的接地。
现在我仍然需要加入异常值检测。受 RANSAC 的启发,我可以选择最长的线段并单独或成对使用它们来获得候选线。对于每一行,评估总误差,并保留给出最小值的行。从那里,一些标准(尚未找到)应该允许拒绝异常值并对内部值执行最终的最小二乘拟合。
最佳答案
我猜测斜率将约为线片段斜率的平均值乘以等于片段长度的因子(或片段长度的平方,具体取决于外围片段的长度)比较)。然后将该线与该斜率进行最佳拟合。
因此,获取线片段,将斜率转换为角度 (arctan2(y1-y0,x1-x0)) 乘以长度,将它们全部加起来,除以(所有片段的总长度)。对位置(线片段的中点位置 * 片段长度)/(所有片段的总长度)执行相同的操作,然后确保具有该斜率的线与具有该值的点相交。
更新:
如果我们不考虑太多斜坡,我们应该根据各个路段的影响在位置上对线路进行最佳拟合,我们再次根据其长度进行加权。
求片段的总长度。迭代片段,直到达到片段总长度的 1/3。这将是你的第一点的x。然后选择一些任意小的值并再次迭代片段,以您选择的速率采样。那么该样本的影响就是给定的 y 乘以 x 与穿过总片段的 x 1/3 的线性距离,所有片段均由所有片段的线性距离总和标准化。对 2/3 的路程执行相同的操作。并在两个结果点之间画一条线。
关于algorithm - 分段线拟合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36682067/