图像上沿多段线/曲线的点的有序列表

2024-09-25 10:22:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些多段线/多曲线组合的图像。我的目标是沿着这些多段线/多曲线恢复点的有序列表

使用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) 

但是,恢复点中的点不沿着原始多段线,它们是原始多段线上的点,但按光栅顺序排列,从左到右,从下到上,这不是我想要的。下面可以看到输入的_图像(原始图像)、骨架图像和恢复的_点(请注意,它们是旋转出来的)。 enter image description here

我还尝试在输入图像的连接组件上使用findContours,然后在等高线上使用approxPolyDP,但这些是原始多段线周围的等高线,因此恢复的多段线的一侧沿着多段线,另一侧沿着复出,在第一个点处闭合,这不是我想要的。请参见下面提取的轮廓图像

enter image description here

在opencv或scikit图像或其他库中是否仍然存在恢复原始多段线/曲线上的有序点的方法


Tags: 图像目标labelsnpcv2opencv曲线等高线
1条回答
网友
1楼 · 发布于 2024-09-25 10:22:21

我编写了一个名为skan的库,用于Python中的骨架图像分析,它可以做您想要做的事情,尽管它对您来说可能太重了。但它解决了与您所面临的问题相同的问题,即您需要在像素邻域上循环,这在Python中很慢。(它使用Numba表示速度。)类skan.Skeleton将执行您想要的操作,具体来说,skeleton.path(0)将为您提供第0条路径的像素索引,skeleton.coordinates[skeleton.path(0)]将为您提供它们的坐标

特别是您的代码:

import cv2
import skimage.morphology
from skan import Skeleton

# [... missing code...]
num_labels, labels_im = cv2.connectedComponents(input_image)     
skeleton_image = skimage.morphology.skeletonize(labels_im==1)
skeleton = Skeleton(skeleton_image)
path_coordinates = skeleton.coordinates[skeleton.path(0)]

相关问题 更多 >