用 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-连接,这会将线分成两部分。

skeletonizemedial_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]]

通过修改掩码,您可以获得您描述的其他示例输出。