使用OpenCV(Python)查找曲线的坐标

3
我正在使用Python中的OpenCV提取图像曲线的坐标。然而,我需要将这些坐标排序在一个列表中,使得这个列表的第一个元素是曲线的一个端点,第二个元素是紧接着这个端点的点,以此类推,直到最后一个元素是另一个端点。
假设我有一张字母“C”的图像,用OpenCV导入为以下的numpy数组:
 arr=
 [0,0,0,0,0,0,0
  0,0,1,1,1,0,0
  0,0,1,0,0,0,0     
  0,0,1,0,0,0,0
  0,0,1,1,1,0,0
  0,0,0,0,0,0,0]

接下来我想要一个列表,按以下顺序返回像素的坐标:

 arr=
 [0,0,0,0,0,0,0
  0,0,3,2,1,0,0
  0,0,4,0,0,0,0     
  0,0,5,0,0,0,0
  0,0,6,7,8,0,0
  0,0,0,0,0,0,0]

即一个列表(数组中像素“1”的坐标,像素“2”的坐标等)。

“连续性”这个概念在findContours()函数中有所体现,但对于查找如此细的1像素宽对象的轮廓并不起作用。结果轮廓中很多像素会出现两次(不是太大的问题),但它可能也不会从一个极端开始,并以某种顺序产生点坐标。

 arr=
 [0,0,0,0,0,0,0
  0,0,1,7,8,0,0
  0,0,2,0,0,0,0     
  0,0,3,0,0,0,0
  0,0,4,5,6,0,0
  0,0,0,0,0,0,0]

这是因为该算法基本上从1到6,然后返回1,继续到8并返回1以产生“轮廓”。 我也尝试了简单的阈值化+ numpy.nonzero方法,但它当然不能按照我希望的顺序排序,它按以下顺序产生结果

 arr=
 [0,0,0,0,0,0,0
  0,0,1,2,3,0,0
  0,0,4,0,0,0,0     
  0,0,5,0,0,0,0
  0,0,6,7,8,0,0
  0,0,0,0,0,0,0]

我有没有错过什么重要的东西?虽然我不是 Python 或图像处理方面的新手,但我刚刚开始接触 OpenCV。

1个回答

2
我不知道有没有一个好的 OpenCV 实现,但是你可以使用 Moore-Neighbor Tracing,并将其修改为在找到边界点时设置该点的值为递增值。

“Moore-Neighbor Tracing” 看起来很有前途,我得试一下。 - Jeru Luke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接