用4邻域进行结构化

时间:2017-10-24 06:11:56

标签: python scikit-image

我正在使用来自skimage的skeletonize,它提供了一个8-neigborhood连接的结果:

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连接结果,例如:

#[[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]]

我该怎么做?在骨架化中没有neigborhood选项。

我之所以要问的是,我想用skimage.measure.find_contours进一步处理连接线,如果它们不是4连接则会将线分成两行。

1 个答案:

答案 0 :(得分:2)

skeletonizemedial_axis都不支持连接参数。但也许你可以通过后处理过程逃脱:

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

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