从2D点列表中检测曲线的算法

时间:2017-05-22 19:20:01

标签: algorithm graph-algorithm computational-geometry image-segmentation feature-detection

我试图从人体躯干模型照片中生成的一组2D点中提取水平线:

overal view of torso point cloud

要点"主要是"以或多或少规则的方式形成水平(ish)线,但可能存在间隙/缺失点:

some missing points

可能存在线条变形的区域:

enter image description here

有背景噪音的地区:enter image description here

当然我需要调整一些东西,以便排除那些有缺陷的部分。我正在寻找的这个问题是建议的算法,以找到行为良好的行,填充最终的间隙,避免最终的噪音,并在一些不连续条件下正确终止行。

我相信可以进行一些优化或投票"洪水填充"这个变种会对候选人进行评分,并且只会产生良好的线条,但我对此并不熟悉,也无法自己解决任何问题。

此数据集为in a gist here,重要的是要注意X坐标是整数,因此点垂直对齐。 Y坐标虽然是十进制数。

2 个答案:

答案 0 :(得分:1)

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

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

这样做,我打赌你会重建大量的曲线,而且还有空隙。

通过估计沿曲线的局部曲率(f.i.通过计算三个点的外接圆,取其他每个点,你可以丢弃嘈杂的部分。

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

处理的第一步:

enter image description here

答案 1 :(得分:0)

这些是表示方向模式的矢量字段的integral curves

因此,可以首先通过从邻域中获取点并使用LS拟合线或执行PCA来找到每个点的斜率矢量(主要方向)。增加邻域半径应该可以处理数据不规则性,从而获得更大规模的斜率趋势,而不是局部噪声。

如果您决定这样做,您可以在这里发布您找到的斜率字段,那么我们可以看到一些切线而不是点吗?