原理这里就不再介绍了
直接上干货
方法一:
使用skimage中的morphology.skeletonize函数
难点在于 我们一般在进行图像处理时使用的是opencv
这玩意和opencv不是完全匹配的 如上述函数的返回值是一个numpy 但值是false/true
需要转换
import cv2
from skimage import morphology
import numpy as np
img = cv2.imread('D:\Desktop\za\\black_white.png', 0)
_,binary = cv2.threshold(img,200,255,cv2.THRESH_BINARY_INV)
for i in range(img.shape[0]):
for j in range(img.shape[1]):
if binary[i][j] == 255:
binary[i][j] = 1
skeleton0 = morphology.skeletonize(binary)
skeleton = skeleton0.astype(np.uint8)*255
cv2.imshow("skeleton.png",skeleton)
cv2.waitKey()
方法二:
参考这篇文章 http://felix.abecassis.me/2011/09/opencv-morphological-skeleton/
import numpy as np
import cv2
im = cv2.imread('D:\Desktop\za\\black_white.png', 0)
ret, im = cv2.threshold(im, 127, 255, cv2.THRESH_BINARY)
element = cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3))
skel = np.zeros(im.shape, np.uint8)
erode = np.zeros(im.shape, np.uint8)
temp = np.zeros(im.shape, np.uint8)
i = 0
while True:
cv2.imshow('im %d' % (i), im)
erode = cv2.erode(im, element)
temp = cv2.dilate(erode, element)
# 消失的像素是skeleton的一部分
temp = cv2.subtract(im, temp)
cv2.imshow('skeleton part %d' % (i,), temp)
skel = cv2.bitwise_or(skel, temp)
im = erode.copy()
if cv2.countNonZero(im) == 0:
break;
i += 1
cv2.imshow('Skeleton', skel)
cv2.waitKey()