假设我有这样一个数组:
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。
如何获取每个区域边界的路径?按顺序列出区域的顶点坐标。
例如,对于左上角的1s,它是(0, 0), (0, 2), (1, 2), (1, 1), (2, 1), (2, 0)。
(最终我想得到类似于"从0,0开始。向右2。向下1。向右-1。向下1。向右-1。向下-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
]
}
那么我该如何将其转换为路径?