对 findContours() 的返回值进行排序;轮廓列表

时间:2021-06-03 19:19:35

标签: python numpy opencv computer-vision

我在排序轮廓时遇到问题,我希望它们如何排序。

我在尝试绘制轮廓然后裁剪的图像中有两列和 K(可变)行。我可以做到这一点,但我需要它们按特定顺序返回。

自从我设法对它们进行排序以来,我已经完成了一半; 第一列首先在轮廓列表中返回,然后在完成后转到第二列并遍历所有行。

这些是对列表进行排序的代码行:

contours, hierarchy = cv2.findContours(dilated_value, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contours.sort(key=lambda c: np.min(c[:, :, 0]))
contours.reverse()

我需要得到一个返回值:[[Column1, row1], [Column2, row1], ....] 等等。

这是一个更具体的例子。

enter image description here

现在它的存储方式如下:

enter image description here

我应该在那个排序指令中改变什么

2 个答案:

答案 0 :(得分:0)

基本上你能做的就是简单地获取所有轮廓,然后找到所有可以用它们形成的多边形。您可以删除较大的,因为您不需要整个表格或整个行/列的轮廓。一旦你过滤掉这些,你将剩下小的,即细胞。然后您可以轻松提取它们并根据它们的质心对它们进行索引。使用这些质心,您将知道每个质心的位置,并可以根据您的选择将它们放在任何位置。

答案 1 :(得分:0)

another question找到答案。

它就像魔法一样工作,请务必为他们点赞,并对原始答案表示感谢。

def get_contour_precedence(contour, cols):
    origin = cv2.boundingRect(contour)
    return origin[1] * cols + origin[0]


contours.sort(key=lambda x:get_contour_precedence(x, image.shape[1]))

可以在原始答案中找到写得很好的解释,但代码是不言自明的。

相关问题