我正在尝试使用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。
答案 0 :(得分:2)
我不知道一个好的opencv实现,但你可以使用Moore-Neighbor Tracing并对其进行修改,以便我们将你在boudary中找到的点的值设置为增量值。