骨架化

2024-06-02 05:03:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用skeletonize from skimage,它提供了一个连接为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]]

我该怎么做?在skeletonize中没有neigborhood选项。你知道吗

我之所以这样问是因为我想用撇除、测量、查找等高线,如果不是4-连接的话,这会把线分成两段。你知道吗


Tags: fromimageimportnumpyasnparrayprint
1条回答
网友
1楼 · 发布于 2024-06-02 05:03:31

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

通过修改掩码,可以获得所描述的其他示例输出。你知道吗

相关问题 更多 >