如何按区域对 regionprops 中的区域进行排序?
how to order the regions in regionprops by area?
我正在做一些 OCR python,为了得到图像中字母的坐标,我取了一个区域的质心(由 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
,因为这样可以更快地检查一个区域是否接近现有的。
我正在做一些 OCR python,为了得到图像中字母的坐标,我取了一个区域的质心(由 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
,因为这样可以更快地检查一个区域是否接近现有的。