Dan*_*Yan 3 python opencv numpy image-processing scikit-image
我想绘制以下图像的骨架:
我尝试使用以下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()
Run Code Online (Sandbox Code Playgroud)
我得到了以下骨架:
这看起来不像正确的骨架图像。我不知道怎么了。
谁可以帮我这个事?任何帮助,将不胜感激!!!
如示例中那样应用中间轴:
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()
Run Code Online (Sandbox Code Playgroud)
产量
请注意,正如@Aaron在下面提到的那样,这里首先转换为布尔图像会有所帮助,因为原始图像存储在JPEG中,这可能会导致像素值产生较小的波动。
您也可以替换medial_axis使用skeletonize了不同的算法。
如果您想要@Tonechas的答案中所述的轮廓,请查看边缘检测方法。