给定距离变换图像找到最短路径

时间:2016-12-12 15:50:39

标签: python-2.7 image-processing transform distance shortest-path

我给了一个距离变换(下面),我需要编写一个程序,找到从A点(140,200)到B点(725,1095)的最短路径,同时确保距离我们至少十个像素任何障碍

distance_transform_given

(上图是map

的距离变换

这是我到目前为止所做的:

  1. 我从初始点开始,评估了周围每个点的灰度强度。 (8个相邻点)

  2. 然后我移动到8个相邻点的灰度强度最高的点。

  3. 然后我重复了这个过程,但是我得到随机转弯而不是最短路径。

  4. 请帮帮我

    到目前为止我所做的代码:

    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)
    

1 个答案:

答案 0 :(得分:0)

由于您根本没有对您的代码发表评论,因此我不会阅读您的代码。

我会坚持你所描述的方法。

你从A点开始并移动到最亮点A的邻居这一事实表明你不知道距离变换的作用或你在距离图中看到的是什么......如果你不知道,就不要开始编码知道你在处理什么。

距离变换将二进制图像转换为图像,其中每个像素的值是输入图像的前景像素与背景的最小距离。

暗像素意味着接近背景(问题中的障碍物),明亮的像素更远。

所以移动到附近最亮的像素只会让你远离障碍物,但永远不会到达你的目标点。

第一个限制: 永远不要靠近障碍物而不是10像素!

这意味着,更接近障碍物(深于10)的每个像素都不能成为您路径的一部分。因此,将全局阈值10应用于距离图。

enter image description here

enter image description here

现在每个白色像素都可用于B的路径。

剩下的就是优化问题。有很多关于在线最短路径算法的文献。我会把它留给你......