假设一条直线以直角相交
你想把它骨架化,得到(你希望的)十字形。相反,使用sklearn.morphology.skeletonize
获得以下图像:
让我们称之为“多孔十字架”
另一方面,您拥有OpenCV和OpenCV skeletonize功能,这些功能在互联网上的几个博客中随处可见,并在下面给出了答案:
def skeletonize(bin: numpy.ndarray, erosion_shape=cv2.MORPH_RECT, kernel_sz: Union[int, Tuple[int, int]] = 3):
kernel_sz = fix_kernel(kernel_sz)
kernel = cv2.getStructuringElement(erosion_shape, kernel_sz)
thresh = bin.copy()
skeleton = numpy.zeros_like(bin)
eroded = numpy.zeros_like(bin)
carry = numpy.zeros_like(bin)
while (True):
cv2.erode(thresh, kernel, dst=eroded)
cv2.dilate(eroded, kernel, dst=carry)
cv2.subtract(thresh, carry, dst=carry)
cv2.bitwise_or(skeleton, carry, dst=skeleton)
thresh, eroded = eroded, thresh
if cv2.countNonZero(thresh) == 0:
return skeleton
这将产生以下结果:
因此,浮动的基本OpenCV骨架化函数存在一些错误或错误,不能使用结构化形状修改Skimage骨架化
有没有办法在python中获得骨架化的十字/加号形状
正如我在评论中指出的,可以通过拟合hough线来清理骨架化图像中的交叉点:
如果要强制进行水平或垂直拟合,
lines
可以进行简单过滤,以排除非水平线和非垂直线:相关问题 更多 >
编程相关推荐