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