【发布时间】: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