找到多对点之间最近的8连锁棋盘距离:最短的m路径

时间:2018-01-18 15:28:48

标签: python algorithm matrix distance-matrix

我正在使用OpenCV在Python中处理二进制图像。我有两组要点:PNode和FNodes。我想找到每个FNode最近的PNode(最短的m路径);最接近8连接的棋盘距离。

在下面的例子中,假设PNodes(由*捐赠)是:(6,1),(6,5)和(5,8)。 (索引从0开始,第一个元素是行号)。 FNodes(用#表示)是:(0,1),(0,9),(1,6),(2,5)和(4,3)。

import numpy as np 
In = np.array ((
      [ 0,  1#, 0,  0,  0,  0,  0,  0,  0,  1#, 0],
      [ 1,  0,  0,  0,  0,  0,  1#, 0,  1,  0,  0],
      [ 0,  1,  0,  0,  0,  1#, 0,  0,  1,  0,  0],
      [ 0,  0,  1,  0,  0,  0,  1,  0,  0,  1,  0],
      [ 0,  1,  1,  1#, 0,  1,  0,  0,  1,  0,  0],
      [ 0,  1,  0,  0,  0,  1,  0,  0,  1*, 0,  0],
      [ 0,  1*, 0,  0,  0,  1*, 0,  0,  1,  0,  0],
      [ 0,  1,  0,  0,  1,  0,  1,  1,  0,  0,  0],
      [ 0,  0,  1,  1,  0,  0,  0,  1,  0,  0,  0]), dtype = "uint8") 

Distance_Matrix =  np.array ((
      [ 0,  6#, 0,  0,  0,  0,  0,  0,  0,  5#, 0],
      [ 5,  0,  0,  0,  0,  0,  5#, 0,  4,  0,  0],
      [ 0,  4,  0,  0,  0,  4#, 0,  0,  3,  0,  0],
      [ 0,  0,  3,  0,  0,  0,  3,  0,  0,  2,  0],
      [ 0,  2,  2,  3#, 0,  2,  0,  0,  1,  0,  0],
      [ 0,  1,  0,  0,  0,  1,  0,  0,  **, 0,  0],
      [ 0, **,  0,  0,  0,  **, 0,  0,  1,  0,  0],
      [ 0,  1,  0,  0,  1,  0,  1,  1,  0,  0,  0],
      [ 0,  0,  1,  1,  0,  0,  0,  1,  0,  0,  0]), dtype = "uint8") 

我并不关心距离的确切值,我只是想找出最近的一对。这样的事情:(0,1)处的FNode最接近(6,1)处的PNode。 (4,3)处的FNode最接近(6,1)处的PNode。所有距离均以8连接的棋盘距离表示。

整个过程的最终要求:基本上,我只是想确保所有PNode都有至少1个FNode,它位于给定的距离范围内(沿着1s的路径)。

假设PNode(PN_1)有一个位于所需距离范围内的FNode(FN_1),我还要确保PN_1最接近FN_1,而不是任何其他PNode。

为了更好地理解,我附上了一张图片; FNode是矩形的,PNode是圆形的。

我不关心此矩阵中的其他元素,除了PNodes和FNodes之外,如图所示。

enter image description here

1 个答案:

答案 0 :(得分:0)

我为此使用了Dijkstra's algorithm。它通过在更远的节点之前探索更近的节点来找到源节点和每个其他节点之间的最短距离。

在每个P节点上播放Dijkstra搜索,并在找到第一个F节点或超出距离约束时停止搜索。

由于您没有图表,因此您可以使用偏移生成邻居。例如,如果您有一个单元格(x,y),则可以定义一些偏移量

dx = [-1,-1, 0, 1,1,1,0,-1]
dy = [ 0,-1,-1,-1,0,1,1, 1]

然后为i∈[0,7] (x + dx [i],y + dy [i])以生成给定的邻居细胞

您可以定义单独的2D数组/矩阵,以跟踪是否已访问过单元格。