【发布时间】:2016-01-10 18:42:15
【问题描述】:
我在 C/C++ 中找到了一些实现,例如 voronoi skeleton。通常这些代码需要密集的循环,这在 python 中是不好的。 python中有没有可以调用的内置骨架函数?
【问题讨论】:
我在 C/C++ 中找到了一些实现,例如 voronoi skeleton。通常这些代码需要密集的循环,这在 python 中是不好的。 python中有没有可以调用的内置骨架函数?
【问题讨论】:
来自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)
【讨论】:
实际上,现在 OpenCV 确实在其扩展图像处理模块中实现了张素骨架化,请参阅https://docs.opencv.org/4.4.0/df/d2d/group__ximgproc.html#ga37002c6ca80c978edb6ead5d6b39740c。
【讨论】:
OpenCV 没有skeleton 功能,但您可以制作自己的功能。来自here:
骨架/MAT可以通过两种主要方式制作。
第一种是使用某种形态细化,从边界连续侵蚀像素(同时保留线段的端点),直到不再细化,此时剩下的部分近似于骨架。
另一种方法是先计算图像的distance transform。然后,骨架位于距离变换中的奇异点(即折痕或曲率不连续点)上。后一种方法更适合计算 MAT,因为 MAT 与距离变换相同,但骨架外的所有点都被抑制为零。
Here你可以找到一个使用形态学运算的例子:
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()
【讨论】: