Python - 根据分数和位置对框进行排序

时间:2017-03-25 20:50:23

标签: python

我一直在研究以下问题:我有一个未知数量的矩形数组,每个都有相应的“得分”:

[{"topleft": {"x": 20, "y": 60}, "bottomright": {"x": 540,"y": 600}, "score": 50}, etc.]

我想要顺序删除这些矩形,直到我到达最后一个矩形。然而,一个重要的规定是,在每次迭代中,我想要删除一个分数最低的最外面的矩形。通过最外层我的意思是如果在所有剩余的矩形周围绘制一个边界框,那么最外面的那些将是那些触及该边界框的那个。

以下是一个例子:

enter image description here

为了便于说明,分数最高的方框为红色,最低分为浅蓝色(最小的矩形),深蓝色的分数为中等分数。

首先,我会移除包含所有这些的最大红色正方形,因为它是与“边界框”共享一侧的唯一框。

然后三个盒子将与边界框共享一侧,小红色框和两个深蓝色框。我会删除其中一个深蓝色的(以最小的分数为准)

这将一直持续到我只剩下小红框(在这种情况下)。希望这是有道理的。

到目前为止,我基本上已经设计了一个循环遍历所有剩余框的算法,并找到分数最小的框也与边界框共享 - 然后我删除该框并重复。这很好 - 但对我来说似乎效率很低。

我想知道是否有人有任何聪明的想法,如何按照需要删除的顺序对框进行排序,然后我只是遍历排序的数组并按顺序删除框。或者这样做甚至没有效率呢?

1 个答案:

答案 0 :(得分:1)

你可以建立四个列表,每个列表对盒子进行排序,使得每个列表都有从上到下,从下到上,从左到右,从右到左的外到内顺序的框。然后你可以选择要删除的框:

b = min([tb[0], bt[0], lr[0], rl[0]], key=lambda b: b["score"])
tb.remove(b)
bt.remove(b)
lr.remove(b)
rl.remove(b)

构建每个列表都需要排序:

tb = sorted(boxes, key=lambda b: b["topleft"]["y"])
lr = sorted(boxes, key=lambda b: b["topleft"]["x"])
bt = sorted(boxes, key=lambda b: b["bottomright"]["y"], reverse=True)
rl = sorted(boxes, key=lambda b: b["bottomright"]["x"], reverse=True)

其中每一个都按照框的四边之一从外到内排序框。