用 4 个邻域骨架化
Skeletonize with 4-neighborhood
我正在使用 skemage 的骨架化,它提供了一个连接为 8 邻域的结果:
import numpy as np
from skimage.morphology import skeletonize
image = np.array(
[[0, 0, 1, 1, 1, 1, 1, 0, 0],
[0, 0, 1, 1, 1, 1, 1, 0, 0],
[0, 0, 1, 1, 1, 1, 1, 1, 1],
[0, 0, 0, 1, 1, 1, 1, 1, 1]])
print image
print
skel = skeletonize(image)
print skel.astype(np.uint8)
# result
#[[0 0 0 0 0 0 0 0 0]
# [0 0 0 1 1 1 0 0 0]
# [0 0 0 0 0 0 1 1 1]
# [0 0 0 0 0 0 0 0 0]]
我想得到的是一个 4-connected 结果,例如:
#[[0 0 0 0 0 0 0 0 0]
#[0 0 0 1 1 1 1 0 0]
#[0 0 0 0 0 0 1 1 1]
#[0 0 0 0 0 0 0 0 0]]
或
#[[0 0 0 0 0 0 0 0 0]
#[0 0 0 1 1 1 0 0 0]
#[0 0 0 0 0 1 1 1 1]
#[0 0 0 0 0 0 0 0 0]]
但不是
#[[0 0 0 0 0 0 0 0 0]
#[0 0 0 1 1 1 0 0 0]
#[0 0 0 0 1 1 1 1 1]
#[0 0 0 0 0 0 0 0 0]]
我该怎么做? skeletonize中没有neigborhood选项。
我问的原因是我想用 skimage.measure.find_contours 进一步处理连接的线,如果它们不是 4-连接,这会将线分成两部分。
skeletonize
和 medial_axis
都不支持连接参数。但也许你可以通过 post-processing pass:
from scipy import ndimage as ndi
diagonals = ndi.correlate(skel.astype(int), [[0, 1, 0], [0, 0, 1], [0, 0, 0]])
skel2 = skel.copy()
skel2[diagonals == 2] = 1
这会产生
[[0 0 0 0 0 0 0 0 0]
[0 0 0 1 1 1 0 0 0]
[0 0 0 0 0 1 1 1 1]
[0 0 0 0 0 0 0 0 0]]
通过修改掩码,您可以获得您描述的其他示例输出。
我正在使用 skemage 的骨架化,它提供了一个连接为 8 邻域的结果:
import numpy as np
from skimage.morphology import skeletonize
image = np.array(
[[0, 0, 1, 1, 1, 1, 1, 0, 0],
[0, 0, 1, 1, 1, 1, 1, 0, 0],
[0, 0, 1, 1, 1, 1, 1, 1, 1],
[0, 0, 0, 1, 1, 1, 1, 1, 1]])
print image
print
skel = skeletonize(image)
print skel.astype(np.uint8)
# result
#[[0 0 0 0 0 0 0 0 0]
# [0 0 0 1 1 1 0 0 0]
# [0 0 0 0 0 0 1 1 1]
# [0 0 0 0 0 0 0 0 0]]
我想得到的是一个 4-connected 结果,例如:
#[[0 0 0 0 0 0 0 0 0]
#[0 0 0 1 1 1 1 0 0]
#[0 0 0 0 0 0 1 1 1]
#[0 0 0 0 0 0 0 0 0]]
或
#[[0 0 0 0 0 0 0 0 0]
#[0 0 0 1 1 1 0 0 0]
#[0 0 0 0 0 1 1 1 1]
#[0 0 0 0 0 0 0 0 0]]
但不是
#[[0 0 0 0 0 0 0 0 0]
#[0 0 0 1 1 1 0 0 0]
#[0 0 0 0 1 1 1 1 1]
#[0 0 0 0 0 0 0 0 0]]
我该怎么做? skeletonize中没有neigborhood选项。
我问的原因是我想用 skimage.measure.find_contours 进一步处理连接的线,如果它们不是 4-连接,这会将线分成两部分。
skeletonize
和 medial_axis
都不支持连接参数。但也许你可以通过 post-processing pass:
from scipy import ndimage as ndi
diagonals = ndi.correlate(skel.astype(int), [[0, 1, 0], [0, 0, 1], [0, 0, 0]])
skel2 = skel.copy()
skel2[diagonals == 2] = 1
这会产生
[[0 0 0 0 0 0 0 0 0]
[0 0 0 1 1 1 0 0 0]
[0 0 0 0 0 1 1 1 1]
[0 0 0 0 0 0 0 0 0]]
通过修改掩码,您可以获得您描述的其他示例输出。