首页 > 解决方案 > 图像上沿折线/曲线的有序点列表

问题描述

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

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

但是,recovered_points 中的点并不沿着原始折线,它们是原始折线上的点,但按光栅顺序,从让到右,从下到上,这不是我想要的。下面你可以看到 input_image(原始图像)、骨架图像和恢复的点(注意它们是旋转出来的)。 在此处输入图像描述

我还尝试在 input_image 的连接组件上使用 findContours,然后在轮廓上使用 approxPolyDP,但这些是原始折线周围的轮廓,因此recovered_points 在一侧沿着折线移动,在另一侧沿着折线返回并关闭第一点,这不是我想要的。请参阅下面提取的轮廓的图像。

在此处输入图像描述

在 opencv 或 scikit-image 或其他库中是否有沿原始折线/曲线恢复有序点?

标签: pythonopencvimage-processingcomputer-visionscikit-image

解决方案


我编写了一个名为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)]

推荐阅读