我在排序轮廓时遇到问题,我希望它们如何排序。
我在尝试绘制轮廓然后裁剪的图像中有两列和 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], ....] 等等。
这是一个更具体的例子。
现在它的存储方式如下:
我应该在那个排序指令中改变什么
答案 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]))
可以在原始答案中找到写得很好的解释,但代码是不言自明的。