代码之家  ›  专栏  ›  技术社区  ›  SinLok

快速确定中心点和路径的方法

  •  2
  • SinLok  · 技术社区  · 7 年前

    我有下面的灰色图像。我可以用 np.transpose(np.nonzero(tmpData)) 找到点的位置。我最初的想法是计算所有点的欧几里德距离,以检查哪个点重复出现。然后根据这个想法找出与这个中心点相关的路径。

    然而,这种方法相当缓慢。我需要2个循环来计算欧几里得距离。1个寻找中心点的循环。和1个回路,用于确认它的方向。

    点位置:

    [ 74 374]
    [ 20 440]
    [149 325]
    [269  52]
    [242 149]
    [252 254]
    [209 329]
    [349 256]
    [449 252]
    [549 245]
    [649 241]
    [732 258]
    [780 316]
    

    enter image description here

    1 回复  |  直到 7 年前
        1
  •  1
  •   poklaassen    7 年前

    Random sample consensus algorithm . 我曾经用这个从点云重建三维实体。因为你的例子是二维的,它会重复地随机选取2个点,并检查有多少个点在可以从这2个点构造的直线的某个阈值内。该算法理想情况下会找到3条线,近似于你所说的“路径”。这些线的交点可以很好地指示您应该在哪里寻找中心点。

    要获得这三条直线,可以从数据集中删除点。因此,首先它会找到最佳拟合,然后将拟合阈值内的点删除。在这之后,它会寻找下一个最佳匹配,以此类推。您可以使用while循环来实现这一点,条件是剩余的点数。为了让你的例子更清楚:

    enter image description here

    enter image description here

    从第二条直线删除点,然后将最后一条直线拟合到左侧的点:

    enter image description here

    enter image description here

    可以考虑将数据放在树结构中,例如 balltree 寻找这3个交叉点的共同最近邻居。

    使用RANSAC,您可能会得到比您想要的更少或更多的线,或者这些线不合适。这完全取决于参数(您可以通过反复试验来优化这些参数)和数据。

    注意:上面的例子只是我用matplotlib做的一个演示,我没有使用RANSAC算法,但结果会有点相同。