如何按区域排序区域属性中的区域?

问题描述

我正在做一些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返回的列表进行排序?以及如何执行此操作?或者,如果您能给出更好的方法来避免另一个区域内的某个区域的问题,请先感谢

解决方法

Python built-in sorted()带有一个key=参数,一个用于排序的函数和一个reversed=参数以降序排序。因此,您可以将循环更改为:

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

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

最后,如果您有很多区域,建议您在运行循环之前使用所有质心构建一个scipy.spatial.cKDTree,因为这样可以更快地检查区域是否与现有区域接近。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...