0

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

目前我有一个算法,但效果不是很好。我取前两点,画一条直线,然后检查以下点是否有一定的公差。但是有一个问题:形成直线的点并不是真的在直线上,而是有一些偏差。这个偏差是相当大的。如果在我的算法中我使偏差足够大以从直线部分获得点,那么其他点在稍微弯曲的部分上但偏差小于指定的点也被提取。

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

这是图片:

在此处输入图像描述

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

4

1 回答 1

0

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

最标准的方法之一是使用最小二乘法。

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

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

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

编辑:如何检查一个段是直 的 有很多选项。

首先,我希望对于一条直线,平均偏差与添加新点大致相同,然后您可以简单地在给定数据的基础上找到一个合理的阈值。

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

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

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

于 2012-09-05T07:39:31.563 回答