我在C / C ++中找到了一些实现,例如voronoi framework。通常这些代码需要密集的循环,这在python中是不好的。有没有可以在python中调用的内置骨架函数?
OpenCV没有框架功能,但是您可以创建自己的功能。从这里:
骨架/ MAT可以通过两种主要方式生成。
第一种方法是使用某种形态学细化方法,该方法会逐渐从边界侵蚀像素(同时保留线段的端点),直到不再可能细化为止,此时剩下的近似于骨架。
另一种方法是首先计算 图像的距离变换。然后,骨骼沿着距离变换中的奇异点(即折痕或曲率不连续点)放置。后一种方法更适合于计算MAT,因为MAT与距离变换相同,但骨架上的所有点均被抑制为零。
在这里,您可以找到一个使用形态运算的示例:
import cv2
import numpy as np
img = cv2.imread('sofsk.png',0)
size = np.size(img)
skel = np.zeros(img.shape,np.uint8)
ret,img = cv2.threshold(img,127,255,0)
element = cv2.getStructuringElement(cv2.MORPH_CROSS,(3,3))
done = False
while( not done):
eroded = cv2.erode(img,element)
temp = cv2.dilate(eroded,element)
temp = cv2.subtract(img,temp)
skel = cv2.bitwise_or(skel,temp)
img = eroded.copy()
zeros = size - cv2.countNonZero(img)
if zeros==size:
done = True
cv2.imshow("skel",skel)
cv2.waitKey(0)
cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)
实际上,现在 OpenCV 确实在其扩展图像处理模块中实现了 Zhang-Suen 骨架化,请参阅https://docs.opencv.org/4.4.0/df/d2d/group__ximgproc.html#ga37002c6ca80c978edb6ead5d6b39740c。
来自https://docs.opencv.org/master/df/d2d/group__ximgproc.html#ga37002c6ca80c978edb6ead5d6b39740c
确保您使用的是 opencv-contrib-python
thinned = cv2.ximgproc.thinning(cv2.cvtColor(image, cv2.COLOR_RGB2GRAY))
Run Code Online (Sandbox Code Playgroud)
默认情况下,thinningType=cv2.ximgproc.THINNING_ZHANGSUEN。但你也可以像这样执行 cv2.ximgproc.THINNING_GUOHALL :
thinned = cv2.ximgproc.thinning(cv2.cvtColor(image, cv2.COLOR_RGB2GRAY), thinningType=cv2.ximgproc.THINNING_GUOHALL)
Run Code Online (Sandbox Code Playgroud)