我有一些多段线/多曲线组合的图像。我的目标是沿着这些多段线/多曲线恢复点的有序列表
使用opencv connectedComponents,我可以隔离图像中的每条多段线/曲线,然后我尝试通过以下步骤获得有序的点序列:
num_labels, labels_im = cv2.connectedComponents(input_image)
ske = skimage.morphology.skeletonize(labels_im==1)
x,y =np.where(ske)
cnt = np.vstack([x,y]).T.reshape(-1, 1, 2)
recovered_points = cv2.approxPolyDP(cnt, 100, False)
但是,恢复点中的点不沿着原始多段线,它们是原始多段线上的点,但按光栅顺序排列,从左到右,从下到上,这不是我想要的。下面可以看到输入的_图像(原始图像)、骨架图像和恢复的_点(请注意,它们是旋转出来的)。
我还尝试在输入图像的连接组件上使用findContours,然后在等高线上使用approxPolyDP,但这些是原始多段线周围的等高线,因此恢复的多段线的一侧沿着多段线,另一侧沿着复出,在第一个点处闭合,这不是我想要的。请参见下面提取的轮廓图像
在opencv或scikit图像或其他库中是否仍然存在恢复原始多段线/曲线上的有序点的方法
我编写了一个名为skan的库,用于Python中的骨架图像分析,它可以做您想要做的事情,尽管它对您来说可能太重了。但它解决了与您所面临的问题相同的问题,即您需要在像素邻域上循环,这在Python中很慢。(它使用Numba表示速度。)类skan.Skeleton将执行您想要的操作,具体来说,
skeleton.path(0)
将为您提供第0条路径的像素索引,skeleton.coordinates[skeleton.path(0)]
将为您提供它们的坐标特别是您的代码:
相关问题 更多 >
编程相关推荐