两个矩形的交并比(IOU)
由于最近的项目里面要用到,虽然是个小东西,但还是来记录一下.
我们先来看下IOU的公式:
IOU=area(ROIT⋂ROIG)area(ROIT⋃ROIG) I O U = a r e a ( R O I T ⋂ R O I G ) a r e a ( R O I T ⋃ R O I G )
现在我们知道矩形T的左下角坐标
(X0,Y0)
(
X
0
,
Y
0
)
,右上角坐标
(X1,Y1)
(
X
1
,
Y
1
)
;
矩形G的左下角坐标
(A0,B0)
(
A
0
,
B
0
)
,右上角坐标
(A1,B1)
(
A
1
,
B
1
)
.
IOU=area(ROIT⋂ROIG)area(ROIT)+arae(ROIG)−area(ROIT⋂ROIG) I O U = a r e a ( R O I T ⋂ R O I G ) a r e a ( R O I T ) + a r a e ( R O I G ) − a r e a ( R O I T ⋂ R O I G )
这里我们可以看到 area(ROIT)跟arae(ROIG) a r e a ( R O I T ) 跟 a r a e ( R O I G ) 在确定坐标而不确定两个矩形是否相交的情况下,为已知的常量.
IOU=area(ROIT⋂ROIG)SXY+SAB−area(ROIT⋂ROIG) I O U = a r e a ( R O I T ⋂ R O I G ) S X Y + S A B − a r e a ( R O I T ⋂ R O I G )
所以,我们只需要求解 area(ROIT⋂ROIG) a r e a ( R O I T ⋂ R O I G ) 即可.
这里我们先来看一下水平方向上的情况:
从上述的三种情况中我们可以看出:
当有重叠或者是内含的情况时,我们可以通过
W=min(X1,A1)−max(X0,A0)
W
=
m
i
n
(
X
1
,
A
1
)
−
m
a
x
(
X
0
,
A
0
)
计算得到重叠部分的长度.当满足第一种情况时,我们发现
W<=0
W
<=
0
竖直方向上的处理方式类似.得到
H
H
<script type="math/tex" id="MathJax-Element-14">H</script>
所以处理成代码的时候可得:
#RT:RightTop
#LB:LeftBottom
def IOU(rectangle A, rectangleB):
W = min(A.RT.x, B.RT.x) - max(A.LB.x, B.LB.x)
H = min(A.RT.y, B.RT.y) - max(A.LB.y, B.LB.y)
if W <= 0 or H <= 0:
return 0;
SA = (A.RT.x - A.LB.x) * (A.RT.y - A.LB.y)
SB = (B.RT.x - B.LB.x) * (B.RT.y - B.LB.y)
cross = W * H
return cross/(SA + SB - cross)