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

时间:2018-07-22 06:22:00

标签: python algorithm opencv

我有以下灰色图像。我可以使用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 个答案:

答案 0 :(得分:1)

我能想到的一件事是使用Random sample consensus algorithm。我曾经用它来从点云中重建3D实体。由于您的示例是2D,因此它将重复选择2个随机点,并检查可以从这2个点构造的线的某个阈值内有多少个点。理想情况下,该算法会找到3条线,近似于您正在谈论的“路径”。这些线的交点可以很好地指示您应该在哪里寻找中心点。

编辑:要获取三行内容,可以从数据集中删除点。因此,首先找到最佳拟合,然后在该拟合阈值内删除点。之后,它将寻找下一个最合适的对象,依此类推。您可以使用while循环并以剩余点数为条件来执行此操作。为了使您的示例更清楚:

这是您找到的第一行:

enter image description here

现在,您从要拟合线的集合中删除点,然后继续,这是第二行:

enter image description here

从第二行中删除点,然后将最后一行拟合到剩余的点:

enter image description here

没有剩余的点可以容纳,所以这意味着您的交叉点应该在这三个交叉点附近:

enter image description here

您可以考虑将数据放入balltree之类的树形结构中,以查找这三个交叉点的公共最近邻。

使用RANSAC可能会得到比您想要的更少或更多的行,或者这些行无法正确容纳。这完全取决于参数(您可以通过反复试验来优化参数)和数据。

注意:上面的示例只是我使用matplotlib进行的演示,我没有使用RANSAC算法,但是结果有些相同。