[英]Find closest 8-connected chessboard distance between multiple pairs of points: shortest m-path
我正在使用OpenCV在Python中處理二進制圖像。 我有兩套觀點:PNodes和FNodes。 我想找到最接近每個FNode的PNode(最短的m路徑); 在八連棋盤距離方面最接近。
在下面的示例中,假設PNode(由*捐贈)是:(6,1),(6,5)和(5,8)。 (索引從0開始,第一個元素是行號)。 FNode(用#表示)是:(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。 所有距離均以八連棋盤距離表示。
這是整個過程的最終要求 :基本上,我只想確保所有PNode都具有至少1個FNode,它們位於給定的距離范圍內(沿1s的路徑)。
假設PNode(PN_1)的FNode(FN_1)在所需的距離范圍內,則我還要確保PN_1最接近FN_1,而不是其他任何PNode。
為了更好的理解,我在下面附加了一張圖片; FNode是矩形的,PNode是圓形的。
如圖所示,除了PNodes和FNodes的元素外,我不在乎此矩陣中的其他元素。
我會為此使用Dijkstra的算法 。 它通過在更遠的節點之前探索更近的節點來找到源節點與每個其他節點之間的最短距離。
在每個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數組/矩陣來跟蹤是否已訪問單元格。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.