我想绘制下图的骨架:

python - 如何使用 scikit-image 获取二值图像的骨架-LMLPHP

我尝试使用以下 Python 代码:

import cv2
from skimage import morphology, color
import matplotlib.pyplot as plt

image = cv2.imread(r'C:\Users\Administrator\Desktop\sample.jpg')
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
image=color.rgb2gray(image)

skeleton =morphology.medial_axis(image)

fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(8, 4))

ax1.imshow(image, cmap=plt.cm.gray)
ax1.axis('off')
ax1.set_title('original', fontsize=20)

ax2.imshow(skeleton, cmap=plt.cm.gray)
ax2.axis('off')
ax2.set_title('skeleton', fontsize=20)

fig.tight_layout()
plt.show()

我得到了以下骨架:

python - 如何使用 scikit-image 获取二值图像的骨架-LMLPHP

这看起来不像是正确的骨架图像。我不知道出了什么问题。

谁可以帮我这个事?任何帮助,将不胜感激!!!

最佳答案

在您的示例中应用中轴:

from skimage import img_as_bool, io, color, morphology
import matplotlib.pyplot as plt

image = img_as_bool(color.rgb2gray(io.imread('CIBUv.png')))
out = morphology.medial_axis(image)

f, (ax0, ax1) = plt.subplots(1, 2)
ax0.imshow(image, cmap='gray', interpolation='nearest')
ax1.imshow(out, cmap='gray', interpolation='nearest')
plt.show()

产量

python - 如何使用 scikit-image 获取二值图像的骨架-LMLPHP

请注意,正如@Aaron 在下面提到的,转换为 bool 图像首先在这里有所帮助,因为您的原始图像存储在 JPEG 中,这可能会导致像素值的小幅波动。

您还可以将 medial_axis 替换为 skeletonize 以获得不同的算法。

如果您想要@Tonechas 的回答中描述的轮廓,请查看边缘检测方法。

关于python - 如何使用 scikit-image 获取二值图像的骨架,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42910106/

10-09 08:40