问题描述
我正在做一些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
,因为这样可以更快地检查区域是否与现有区域接近。