我在C / C ++中找到了一些实现,例如voronoi skeleton。通常这些代码需要密集循环,这在python中很糟糕。是否可以在python中调用任何内置框架函数?
答案 0 :(得分:6)
OpenCV没有骨架功能,但您可以自己创建功能。来自http://blog.jetbrains.com/idea/2015/09/intellij-idea-15-eap-help-us-test-the-adjustments-for-color-deficiency/:
骨架/ MAT可以通过两种主要方式生成。
第一种是使用某种形态变薄,它连续地从边界侵蚀掉像素(同时保留线段的端点),直到不再可能变薄,此时剩下的近似于骨架。
另一种方法是首先计算图像的here。然后骨架沿着距离变换中的奇点(即折痕或曲率不连续)。后一种方法更适合计算MAT,因为MAT与距离变换相同,但骨架上的所有点都被抑制为零。
distance transform你可以找到一个使用形态学操作的例子:
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()
答案 1 :(得分:4)
实际上,如今,OpenCV在其扩展图像处理模块中确实实现了张素骨架的实现,请参见https://docs.opencv.org/4.4.0/df/d2d/group__ximgproc.html#ga37002c6ca80c978edb6ead5d6b39740c。
答案 2 :(得分:2)
来自https://docs.opencv.org/master/df/d2d/group__ximgproc.html#ga37002c6ca80c978edb6ead5d6b39740c
确保您使用的是 opencv-contrib-python
thinned = cv2.ximgproc.thinning(cv2.cvtColor(image, cv2.COLOR_RGB2GRAY))
默认情况下,thinningType=cv2.ximgproc.THINNING_ZHANGSUEN。但是你也可以像这样执行 cv2.ximgproc.THINNING_GUOHALL:
thinned = cv2.ximgproc.thinning(cv2.cvtColor(image, cv2.COLOR_RGB2GRAY), thinningType=cv2.ximgproc.THINNING_GUOHALL)