繁体   English   中英

是否有内置 function 进行骨架化?

[英]Is there a build-in function to do skeletonization?

我在 C/C++ 中找到了一些实现,例如voronoi skeleton 通常这些代码需要密集的循环,这在 python 中是不好的。 有没有可以在python中调用的内置骨架function?

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()

实际上,现在 OpenCV 确实在其扩展图像处理模块中实现了张素骨架化,请参见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))

默认情况下,thinningType=cv2.ximgproc.THINNING_ZHANGSUEN。 但是您也可以像这样执行 cv2.ximgproc.THINNING_GUOHALL:

thinned = cv2.ximgproc.thinning(cv2.cvtColor(image, cv2.COLOR_RGB2GRAY), thinningType=cv2.ximgproc.THINNING_GUOHALL)

形态学的skeletonization化过程仅使用此链接中的腐蚀、膨胀和减法方法:

产生以下操作和结果:

示例形态模式化开始结果

示例形态图式化中间结果

示例形态图式化中间结果

示例形态模式化最终结果

这可以在Opencv-Flow工具中在线模拟,但是复制这个例子很累。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM