gpt4 book ai didi

python - 获取二维数组中连续区域边界的路径

转载 作者:行者123 更新时间:2023-12-05 07:29:55 25 4
gpt4 key购买 nike

假设我有一个这样的数组:

import numpy as np

arr = np.array([
[1, 1, 3, 3, 1],
[1, 3, 3, 1, 1],
[4, 4, 3, 1, 1],
[4, 4, 1, 1, 1]
])

有 4 个不同的区域:左上角的 1s、3s、4s 和右上角的 1s。

我如何获得每个区域边界的路径?区域顶点的坐标,按顺序排列。

比如左上角的1​​,就是(0, 0), (0, 2), (1, 2), (1, 1), (2, 1), (2, 0)

(我最终想以 start at 0, 0. Right 2. Down 1. Right -1. Down 1. Right -1. Down -2. 结束,但它是易于转换,因为它只是相邻顶点之间的差异)

我可以使用 scipy.ndimage.label 将它分成多个区域:

from scipy.ndimage import label

regions = {}
# region_value is the number in the region
for region_value in np.unique(arr):
labeled, n_regions = label(arr == region_value)
regions[region_value] = [labeled == i for i in range(1, n_regions + 1)]

看起来更像这样:

{1: [
array([
[ True, True, False, False, False],
[ True, False, False, False, False],
[False, False, False, False, False],
[False, False, False, False, False]
], dtype=bool), # Top left 1s region
array([
[False, False, False, False, True],
[False, False, False, True, True],
[False, False, False, True, True],
[False, False, True, True, True]
], dtype=bool) # Right 1s region
],
3: [
array([
[False, False, True, True, False],
[False, True, True, False, False],
[False, False, True, False, False],
[False, False, False, False, False]
], dtype=bool) # 3s region
],
4: [
array([
[False, False, False, False, False],
[False, False, False, False, False],
[ True, True, False, False, False],
[ True, True, False, False, False]
], dtype=bool) # 4s region
]
}

那么如何将其转换为路径?

最佳答案

伪代码的想法是执行以下操作:

scan multi-dim array horizontally and then vertically until you find True value (for second array it is (0,4))
output that as a start coord
since you have been scanning as determined above your first move will be to go right.
repeat until you come back:
move one block in the direction you are facing.
you are now at coord x,y
check values of ul=(x-1, y-1), ur=(x-1, y), ll=(x, y-1), lr=(x,y)
# if any of above is out of bounds, set it as False
if ul is the only True:
if previous move right:
next move is up
else:
next move is left
output previous move
move by one
..similarly for other single True cells..
elif ul and ur only True or ul and ll only True or ll and lr only True or ur and lr only True:
repeat previous move
elif ul and lr only True:
if previous move left:
next move down
elif previous move right:
next move up
elif preivous move down:
next move left:
else:
next move right
output previous move
move one
elif ul, ur, ll only Trues:
if previous move left:
next move down
else:
next move right
output previous move, move by one
...similarly for other 3 True combos...

对于第二个数组,它将执行以下操作:

finds True val at 0,4
start at 0,4
only lower-right cell is True, so moves right to 0,5 (previous move is None, so no output)
now only lower-left cell is True, so moves down to 1,5 (previous move right 1 is output)
now both left cells are True, so repeat move (moves down to 2,5)
..repeat until hit 4,5..
only upper-left cell is True, so move left (output down 4)
both upper cells are true, repeat move (move left to 3,4)
both upper cells are true, repeat move (move left to 2,4)
upper right cell only true, so move up (output right -3)
..keep going until back at 0,4..

尝试可视化所有可能的坐标相邻单元格组合,这将使您对可能的流程有一个直观的了解。另请注意,使用此方法应该不可能遍历所有 4 个邻居都为 False 的坐标。

关于python - 获取二维数组中连续区域边界的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52516043/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com