我想在线条片段上插入一条线,即一小部分(通常少于10个)大致属于该线条的线段。该线有一个小坡度。但是有一些异常值:线外的段(通常更小)。下图显示了典型案例。这些碎片之间没有水平重叠。
我宁愿避免尝试适合所有细分的子集并保持最佳状态。由于样本太小,我也不会依赖RANSAC。
有什么建议吗?
更新:
我现在计划将问题重新设计为在点上拟合线,即各个线段上的点的无穷大,假设线性密度恒定。通过以整数形式重写最小二乘方程,可以看出我们可以认为这些段集中在它们的中间,权重等于它们的长度;还有一个额外的术语考虑他们的坡度。这为分段上的拟合提供了良好的接地。
现在我仍然需要加入异常值检测。在RANSAC的启发下,我可以挑选最长的片段并单独或成对使用它们来获得候选线。对于每一行,评估总误差,并保持线给出最小值。从那里,一些标准(尚未找到)应该允许拒绝异常值并在内点上执行最终的最小二乘拟合。
答案 0 :(得分:1)
我猜测斜率将围绕线片段斜率的平均值乘以等于片段长度的因子(或片段长度的平方,取决于片段长度的长度)相比较)。然后最好的那条线与该斜率。
因此,取线条片段,将斜率转换为角度(arctan2(y1-y0,x1-x0))乘以长度将它们全部加起来,除以(所有片段的总长度)。对位置做同样的事情(线段中点的位置*片段的长度)/(所有片段的总长度),然后确保具有该斜率的线截取具有该值的点。
更新
如果我们不考虑斜坡,我们应该只考虑各个部分的影响,使其在位置方面最合适,我们再次根据它们的长度进行加权。
查找片段的总长度。迭代碎片,直到你到碎片总长度的1/3。那将是你的第一点的x。然后选择一些任意小的值并再次迭代碎片,以您选择的速率进行采样。然后,该样本的影响是给定的y乘以x与通过总片段的x 1/3的线性距离,所有这些都通过所有片段的线性距离的总和进行归一化。对于2/3的方式也一样。并在两个结果点之间画一条线。
答案 1 :(得分:1)
正如你所问,我有一些建议。对我来说,完整而有效的答案对我来说太过分了。我的建议包含两个主要部分。一个接一个地拿走它们:
处理异常值
摆脱异常值的一个建议是对线段进行聚类。然后,不要担心落在群集之外的行。但是,你如何聚集线条?将整个2D平面划分为y = 0 to a
,y = a to 2a
,y = 2a to 3a
等。属于同一y = i to j
条纹的线段将是您用于生成i
条带的线段正确条带的1}}和j
值。
但是有一个问题:如果线段没有水平分割怎么办?如果多数线倾斜38度而不是接近0怎么办?在这种情况下,您可以执行Principle Component Analysis。很抱歉将您链接到这样一个开放式的想法 - 您的问题有点需要它。
重新排列线条,使它们与X轴主要平行,然后,如上所述,找到包含大部分线条的条纹。
近似最佳拟合线:
现在,在完成正确的条带后,取出条纹中的所有线段并将它们加密。致密化是将线段近似为点集合的步骤。由于所有这些线段都在y = i
和y = j
之间,因此您可以从第y = (i + j) / 2
行开始作为最佳拟合线。然后:
y = c
。我意识到这一切可能并不容易想象。以下是PCA维基百科图片的link。这是一个link to another answer演示线密集化。