我一直在研究以下问题:我有一个未知数量的矩形数组,每个矩形都有相应的“分数”:
[{"topleft": {"x": 20, "y": 60}, "bottomright": {"x": 540,"y": 600}, "score": 50}, etc.]
我想依次删除这些矩形,直到到达最后一个矩形。然而,最大的规定是,在每次迭代中,我都想删除得分最低的最外面的矩形之一。通过最我的意思是,如果一个边界框是围绕所有剩余的矩形得出,最外面将是那些触摸该边框。
下面是一个例子:
出于此说明的目的,得分最高的框是红色的,得分最低的框是浅蓝色(那里最小的矩形),深蓝色的框是中等得分。
首先,我将删除包含所有这些的最大红色方块,因为它是唯一与“边界框”共享一侧的框。
然后三个盒子将与边界框共享一侧,红色的小盒子和深蓝色的盒子。我会删除其中一个深蓝色的(以得分最小的为准)
这将一直持续到我只剩下小红框(在这种情况下)。希望这是有道理的。
到目前为止,我基本上已经设计了一个算法,该算法循环遍历所有剩余的框并找到分数最小的框,该框也与边界框共享一侧 - 然后我删除该框并重复。这工作得很好 - 但对我来说似乎效率很低。
我想知道是否有人对如何按照需要删除的顺序对框进行排序有任何聪明的想法,然后我只需遍历已排序的数组并按顺序删除这些框。或者,这样做甚至不会更有效率?
您可以构建四个列表,每个列表对盒子进行排序,这样每个列表都具有从外到内的顺序,从上到下、从下到上、从左到右、从右到左。然后你可以选择要删除的框:
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)
这些中的每一个都沿着盒子的四个边之一按从外到内的顺序排列盒子。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句