-2

我給出的距離變換(如下圖),我需要編寫一個發現的最短路徑從A點(140,200)去B點(725,1095),同時確保我的程序是從任何障礙至少十個像素遠找到最短路徑一定距離變換的圖像

distance_transform_given

(以上圖像的距離變換map

這是我迄今所做的:

  1. 我從最初的時候開始,評估周圍每個點的灰度強度。 (8個相鄰點即是)

  2. 然後我移動到點與8個相鄰的點的最高灰度強度。

  3. 然後我重複這個過程,但我看到一些隨機的轉彎,而不是最短路徑。

請你幫我出

碼是什麼我迄今所做的:

def find_max_neigh_location(np,img): 
maxi = 0 
x0=0 
y0=0 
for i in range(len(np)): 
    if img[np[i][0]][np[i][1]][0] >maxi: 
     maxi = img[np[i][0]][np[i][1]][0] 
     x0 = np[i][0] 
     y0 = np[i][1] 
return x0,y0 

------------------ -----------------------------------------------

def check_if_extremes(x,y): 
    if(x==1099 and y==1174):return 1 
    elif(y==1174 and x!=1099):return 2 
    elif(x==1099 and y!=1174):return 3 
    else:return 0 

---------------------------------------------- ----------

def find_highest_neighbour(img,x,y,visted_points): 
val = check_if_extremes(x,y) 
if val==1: 
    neigh_points = [(x-1,y),(x-1,y-1),(x,y-1)] 
    np = list(set(neigh_points)-set(visited_points)) 
    x0,y0 = find_max_neigh_location(np,img) 
elif val==2: 
    neigh_points = [(x-1,y),(x-1,y-1),(x,y-1),(x+1,y-1),(x+1,y)] 
    np = list(set(neigh_points)-set(visited_points)) 
    x0,y0 = find_max_neigh_location(np,img)  
elif val==3: 
    neigh_points = [(x-1,y),(x-1,y-1),(x,y-1),(x,y+1),(x-1,y+1)] 
    np = list(set(neigh_points)-set(visited_points)) 
    x0,y0 = find_max_neigh_location(np,img) 
elif val==0: 
    neigh_points = [(x-1,y),(x-1,y-1),(x,y-1),(x,y+1),(x+1,y),(x+1,y+1),(x,y+1),(x-1,y+1)] 
    np = list(set(neigh_points)-set(visited_points)) 
    x0,y0 = find_max_neigh_location(np,img) 
for pt in neigh_points: 
    visited_points.append(pt) 
return x0,y0,visited_points 

--------------------------------------------- ------------

def check_if_neighbour_is_final_pt(img,x,y): 
l = [(x-1,y), (x+1,y),(x,y-1),(x,y+1),(x-1,y-1),(x+1,y+1),(x-1,y+1),(x+1,y-1)] 
if (725,1095) in l: 
    return True 
else: 
    return False 

------------------------------- -------------------------------

x=140 
y=200 
pos=[] 
count = 0 
visited_points = [(x,y)] 
keyword = True 
while keyword: 
    val = check_if_neighbour_is_final_pt(img,x,y) 
    if val == True: 
     keyword = False 
    if val == False: 
     count=count+1 
     x,y,visited_points = find_highest_neighbour(img,x,y,visited_points) 
     img[x][y] = [255,0,0] 
cv2.imwrite("img\distance_transform_result__"+str(count)+".png",img) 
+0

這不是一個免費的作業服務。嘗試自己解決問題。你可能會在路上尋求幫助,但是你可能不會要求幫助,甚至你已經開始考慮這個問題......來吧。 – Piglet

+0

嘿,我只是想指出一個方向。我發佈了整個問題的完整性。我希望你能看到過去並幫助我。 – kaysri

+0

@Piglet 我要說出我迄今所做的(雖然我不知道這是否是正確的做法): 我一開始是在初始點和評估周圍的每一個點的灰度強度。 (8個相鄰點即是) 然後我移動到點與8個相鄰的點的最高灰度強度。 然後我重複了這個過程,但是我得到了隨機輪迴,而不是最短路徑。 請幫我:) – kaysri

回答

0

因爲你沒有評論你的代碼,所以我贏了'閱讀你的代碼。

我會堅持你所描述的你的方法。

事實上,你從A點開始並移動到最亮的點A的鄰居表明你不知道距離變換做了什麼或者你在距離圖中看到了什麼......如果你不願意開始編碼不知道你在處理什麼。

距離變換變換爲二值圖像轉換成圖像,其中每個像素的值是輸入圖像的前景像素到背景的最小距離。

暗像素意味着接近背景(問題中的障礙),亮像素距離更遠。

因此,移動到附近最亮的像素只會引導您遠離障礙物,但永遠不會到達目標點。

第一個限制: 千萬別超過10個像素更接近障礙!

這意味着,每一個更靠近障礙物(大於10較暗)不能成爲你路徑的一部分像素。因此,將全局閾值10應用於距離圖。

enter image description here

enter image description here

現在每個白色像素,可用於路徑,以B.

其餘IST的優化問題。有大量關於最短路徑算法的文獻在線。我會離開,你...