从二维点列表中检测曲线的算法

Algorithm to detect curved lines from list of 2D points

我正在尝试从人体躯干模型照片生成的一组二维点中提取水平线:

点 "mostly" 以或多或少规则的方式形成水平(左右)线,但可能 gaps/missing-points:

线条可能会有些变形:

有背景噪声的区域:

当然我需要调整一些东西,所以我排除了那些有缺陷的部分。我在这个问题上寻找的是一种建议的算法,用于找到行为良好的线路,填补最终的差距并避免最终的噪音,并在某些不连续条件下正确终止线路。

我相信可能会有一些优化或投票 "flood fill" 变体可以对候选行进行评分并只产生格式正确的行,但我对此没有经验,无法自己想出任何东西。

这个数据集是in a gist here,需要注意的是X坐标是整数,所以点是垂直对齐的。 Y坐标虽然是十进制数。

我会先找到每个点的最近邻居,然后是另一边的第二个最近邻居(我的意思是只考虑与点相对的半平面中的点第一个邻居)。

如果到第二个邻居的距离超过到第一个邻居距离的两倍,则忽略它。

只要这样做,我敢打赌您将重建大量曲线,并留有未填充的间隙。

通过估计沿曲线的局部曲率(f.i。通过计算三个点的外接圆,每隔一个点,可以丢弃噪声部分。

然后为了填补空白,您可以检测曲线端点并在外推方向周围的角度中寻找最近的端点。

处理的第一步:

这些是integral curves表示方向图的矢量场。

因此,也许可以从为每个点找到斜率向量(主要方向)开始,方法是从邻域中获取点并使用 LS 拟合一条线或执行 PCA。增加邻域半径应该可以处理数据不规则性,从而获得更大范围的斜率趋势而不是局部噪声。

如果您决定这样做,可以post在这里找到您找到的坡度场,这样我们可以看到一些切线而不是点吗?