如何按面积对regionprops中的区域进行排序?

3

我正在使用Python进行OCR,目的是获取图像中字母的坐标。为了实现这一点,我使用skimage.measure中的regionprops返回区域的质心,并且如果一个质心与其他质心之间的距离小于某个值,我就删除该区域。我认为这样可以解决一些区域嵌套问题,但我忽略了一个问题,如果先检测到一个面积较小的区域(比如一个字母的一部分),所有更大的区域(可能包含整个字母)都会被忽略。以下是我的代码:

 centroids = []
    for region in regionprops(label_image):
       if len(centroids) == 0:
           centroids.append(region.centroid[1])
           do some stuff...
       if len(centroids) != 0:
           distances = []
           for centroid in centroids:
              distance = abs(centroid - region.centroid[1])
              distances.append(distance)
           if all(i >= 0.5 * region_width for i in distances):
              do some stuff...
           centroids.append(region.centroid[1])

现在的问题是如何按面积对regionprops返回的列表进行排序? 有什么方法可以做到这一点吗?或者您是否可以提供一个更好的方法来避免一个区域在另一个区域内的问题,谢谢。

1个回答

5

Python内置函数sorted()接受一个key=参数,用于排序的函数和一个reversed=参数以按降序排序。因此,您可以将循环更改为:

    for region in sorted(
            regionprops(label_image),
            key=lambda r: r.area,
            reverse=True,
    ):

要检查一个区域是否完全包含在另一个区域内,您可以使用r.bbox,并检查一个框是否在另一个框内或重叠。

最后,如果您有很多区域,我建议您在运行循环之前使用所有质心构建一个scipy.spatial.cKDTree,这将使检查一个区域是否靠近已有的区域变得更快。


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