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)
但是,recovered_points 中的点并不沿着原始折线,它们是原始折线上的点,但按光栅顺序,从让到右,从下到上,这不是我想要的。下面你可以看到 input_image(原始图像)、骨架图像和恢复的点(注意它们是旋转出来的)。
我还尝试在 input_image 的连接组件上使用 findContours,然后在轮廓上使用 approxPolyDP,但这些是原始折线周围的轮廓,因此recovered_points 在一侧沿着折线移动,在另一侧沿着折线返回并关闭第一点,这不是我想要的。请参阅下面提取的轮廓的图像。
在 opencv 或 scikit-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)]
推荐阅读
- javascript - 生成 SHA256 哈希的等效 JavaScript 代码
- java - Tomcat 9 JMX RMI 认证漏洞
- javascript - 如何从包含链接文本的单元格列中提取 url,其中包含 Google 表格中的数值?
- python - 尽管指定了路径,但 Conda 不会在本地安装 pip
- python - 天赋 PermissionError:[Errno 13] 权限被拒绝:'/root/.cache'
- javascript - 在 React-Native 中获取 'TypeError: interpolate is not a function'
- android - 错误 5000:应用程序在使用 cordova-plugin-health 查询活动数据时需要用户的 OAuth 同意
- reactjs - 默认导出 eslint 问题
- algorithm - 查找需要排除以匹配预期总和的求和问题的项
- c++ - C++ 有人可以解释一下这个 << 和 >> 操作重载以显示类内容吗?