【问题标题】:Ordered list of points along polylines/curves on an image图像上沿折线/曲线的有序点列表
【发布时间】:2020-10-10 06:40:25
【问题描述】:

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

使用 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,但这些是原始折线周围的轮廓,因此恢复的点在一侧沿着折线移动,在另一侧沿着折线返回,关闭第一点,这不是我想要的。请参阅下面提取轮廓的图像。

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

【问题讨论】:

  • 您可以按照黄线从顶部的黄色像素开始并检查其邻居以找到下一个黄色像素。继续直到到达最低的黄色像素。
  • 我想避免在 python 中使用迭代方法(例如跟踪折线),以便更快地处理。但是,如果我找不到现有图像处理原语的替代方案,我想我将不得不按照您的建议进行操作。
  • 我们也可以得到原图吗?
  • @martinako 我希望这对您的情况也有用answer
  • 好的,我明白了,它正在寻找连接组件的质心,然后扫描该质心周围的点以获得与光栅排序不同的点。但是,这不适用于非凸形。 @rayryeng 原始图像是机器人在沿着走廊移动时导航的占用网格的一部分,因此在原始图像中只有另一个连接组件对应于可见墙的另一侧,其余部分是空白的。

标签: python opencv image-processing computer-vision scikit-image


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-16
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    相关资源
    最近更新 更多