python中每个像素的距离贴图

python中每个像素的距离贴图,python,distance-matrix,Python,Distance Matrix,我需要一些帮助来实现Python中的距离映射 我有一个numpy格式的二进制迷宫(1=墙,0=自由空间),我想实现一个从迷宫中某个点出发的距离贴图。距离图不得穿过墙壁 我看到的迷宫是这样的,距离图应该是从蓝色区域出来的 我认为距离贴图应该从蓝色区域向外发展,并给迷宫中的每个体素一个表示最短距离的值。给你一个想法 有人对如何实现这个或者甚至代码示例有想法吗 谢谢你的帮助 我在下面的WetTransfer链接中上传了numpy 我使用的起点是(56104)您可以使用以下算法: 将所有距离设置为某个较

我需要一些帮助来实现Python中的距离映射

我有一个numpy格式的二进制迷宫(1=墙,0=自由空间),我想实现一个从迷宫中某个点出发的距离贴图。距离图不得穿过墙壁

我看到的迷宫是这样的,距离图应该是从蓝色区域出来的

我认为距离贴图应该从蓝色区域向外发展,并给迷宫中的每个体素一个表示最短距离的值。给你一个想法

有人对如何实现这个或者甚至代码示例有想法吗

谢谢你的帮助

我在下面的WetTransfer链接中上传了numpy


我使用的起点是(56104)

您可以使用以下算法:

  • 将所有距离设置为某个较大的数字,例如9e99,但起点除外(显然距离为0)
  • 在所有单元格上循环,每个单元格在所有相邻单元格(墙除外)中获得i的
    min(i+1)
  • 重复第2步。直到没有值改变
  • 一种稍微复杂但速度更快的方法是执行相同的操作,但只在上一次迭代中更新的单元附近的单元上循环

    例如,我的迷宫:

    0, 0, 0
    0, 1, 0
    0, 1, 0
    
    这里1是墙,0是非墙。左上角是我的出发点。距离为:

     0, 9e9, 9e9
    9e9, 9e9, 9e9
    9e9, 9e9, 9e9
    
    迭代:

     0,   1, 9e9
     1, 9e9, 9e9
    9e9, 9e9, 9e9
    
     0,   1, 2
     1, 9e9, 9e9
     2, 9e9, 9e9
    
     0,   1, 2
     1, 9e9, 3
     2, 9e9, 9e9
    
     0,   1, 2
     1, 9e9, 3
     2, 9e9, 4
    
     0,   1, 2
     1, 9e9, 3
     2, 9e9, 4
    

    停止

    您可以使用正在传播的前端,例如:

    import matplotlib.pyplot as plt
    
    
    def cond(x, y, max_x, max_y, maze):
        return 0 <= x < max_x and 0 <= y < max_y and maze[y][x] == 0
    
    def neighbours(point, maze):
        max_x = len(maze[0])
        max_y = len(maze)
        x = point[0]
        y = point[1]
    
        list_neighbours = [(i, y) for i in (x - 1, x + 1) if cond(i, y, max_x, max_y, maze)] \
                          + [(x, j) for j in (y - 1, y + 1) if cond(x, j, max_x, max_y, maze)]
    
        return list_neighbours
    
    
    maze = [
        [0, 0, 1, 1],
        [0, 1, 1, 0],
        [0, 0, 0, 0],
        [0, 0, 1, 0]
    ]
    
    start = (0, 0)
    maze_copy = [[-1] * len(maze[0]) for _ in range(len(maze))]
    
    front = [(0, 0)]
    step = 0
    while front:
        new_front = []
        for point in front:
            new_front += [p for p in neighbours(point, maze) if maze_copy[p[1]][p[0]] == -1]
            maze_copy[point[1]][point[0]] = step
    
        step += 1
        front = list(set(new_front))
    
    print(maze_copy)
    plt.imshow(maze_copy, cmap='hot', interpolation='nearest')
    plt.show()
    

    代码位于
    O(n^2*m)
    中,其中n表示迷宫的大小,m表示步数。作为旁注,您可以使用
    float('inf')
    而不是任意大的值numbers@BlueSheepToken我把它写成O(n^1.5)(n是像素总数)。如果你实现了稍微复杂一点的版本,它就会变成O(n)。如果我理解得很好,我的
    n^2
    就是你的
    n
    。我很想知道
    n^0.5
    是从哪里来的,你能提供更多的细节吗?听起来不错!但是如何实现停止条件呢?如何实现对角线距离的长度值sqrt(2)?它是一个正方形,因此从一个角到另一个角的距离是2*n^0.5(如果没有循环),向左n^0.5,向下n^0.5(如果是正方形),显然存在最坏的情况,但这将是相当准确的,如何实现对角线距离的长度值sqrt(2)?@Nathan,你能给我一个输入吗?我无法用循环重现这个问题,因为它在我这边运行得很好。@VincentWin不是在
    列表\u neights
    中只有相邻距离,而是可以添加对角线距离,并相应地更新
    迷宫副本。这有点直截了当now@BlueSheepToken我犯了一个错误,nvm@BlueSheepToken,我尝试用sqrt(2)实现对角线,但不幸失败。你能帮帮我吗?非常感谢你。您的代码已经帮了很多忙:)不幸的是,在我的例子中,计算时间非常长,因为我的数组大小为120120。你不知道如何减少它?
    
    [0, -1, -1, -1]
    [-1, -1, -1, -1]
    [-1, -1, -1, -1]
    [-1, -1, -1, -1]
    
    [0, 1, -1, -1]
    [1, -1, -1, -1]
    [-1, -1, -1, -1]
    [-1, -1, -1, -1]
    
    [0, 1, -1, -1]
    [1, -1, -1, -1]
    [2, -1, -1, -1]
    [-1, -1, -1, -1]
    
    [0, 1, -1, -1]
    [1, -1, -1, -1]
    [2, 3, -1, -1]
    [3, -1, -1, -1]
    
    [0, 1, -1, -1]
    [1, -1, -1, -1]
    [2, 3, 4, -1]
    [3, 4, -1, -1]
    
    [0, 1, -1, -1]
    [1, -1, -1, -1]
    [2, 3, 4, 5]
    [3, 4, -1, -1]
    
    [0, 1, -1, -1]
    [1, -1, -1, 6]
    [2, 3, 4, 5]
    [3, 4, -1, 6]