提取满足一定条件的点

时间:2012-09-04 16:01:51

标签: algorithm geometry extract point

我在一个平面上有一系列点。它们形成一些形状。我需要从这个数组中提取点,这些点只形成这种形状的直线。

此时我有一个算法,但它不能很好地工作。我先取两个点,做一条直线然后检查下面的点是否有一些公差。但是有一个问题:形成直线的点并不是真正的直线而是有一些偏差。这种偏差非常大。如果在我的算法中我使偏差足够大以从直线部分获得点,则稍微弯曲部分上但偏差小于指定值的其他点也被提取。

我正在寻找关于如何执行此类任务的一些想法。

这是图片:

enter image description here

圆圈是我要提取的部分。红点是我可以用我的方法提取的部分。如果我增加公差,那么我也会错过直线。

1 个答案:

答案 0 :(得分:0)

首先,如果您已经有一些候选点的子集,并想检查它们是否位于一条直线上。使用linear regression形式来确定最佳拟合线,然后检查它的拟合程度,并接受或拒绝该特定线段基于此线性的假设。

最常用的方法之一是使用Least Squares方法。

识别子集是一个不同的问题,最佳解决方案将在很大程度上取决于您拥有的数据类型和目标。我建议枚举所有段是一个很好的起点,如果数据量不是非常大,那我应该在不超过立方时间内完成。

当然可以应用一些近似值,例如:选择序列中的一个点并通过在两侧迭代地添加点来构建子集,只要该段在公差阈值内保持线性,而不是在段足够长时接受或拒绝它。

我在这里假设曲线可以通过其中一个坐标进行参数化。如果不是这种情况,例如如果曲线关闭,可能需要额外的步骤将曲线分成可参数化的段。

编辑:如何检查细分是否正确 有很多选择。

首先,我认为对于一条直线,平均偏差将与添加新点大致相同,那么您可以根据数据找到合理的阈值。< / p>

第二个选项是进一步将子集拆分为固定数量的部分(例如2),找到每个部分的最佳拟合线,然后比较这些。在直线的情况下,应该预测大致相同的线,但对于曲线,它将是不同的。

第三个选项是执行非线性曲线拟合,例如拟合二次曲线并检查二次项的系数 - 如果直线,它应该接近于零。

当然,在每种情况下,在分段大小与该分段的点偏差之间存在权衡。在极端情况下,将存在一个具有巨大偏差的巨大线性区段或具有0个偏差的两点区段的整个区域。必须为给定数据集选择偏差的实际阈值,切线曲线之间的差异或二次项的大小(取决于您喜欢的选项)以满足您的需要。看一下情节,我会说应该选择阈值,以便允许长度为10左右的段。