1. 程式人生 > >計算影象中任意四個點連成的四邊形面積與Ground truth的IOU(Python)

計算影象中任意四個點連成的四邊形面積與Ground truth的IOU(Python)

1.先求任意四個點連成四邊形的面積

這個問題可以用下面的圖簡單的看一下

影象的座標如上圖所示,大致的想法就是四個點可以確定四條線,然後進行判斷,在紅色區域中則為面積中的一個畫素,否則不在。先求四條線的斜率

def line_slope(x1,y1,x2,y2,x3,y3,x4,y4):
        k1=(y2-y1)/(x2-x1)
        k2=(y3-y2)/(x3-x2)
        k3=(y4-y3)/(x4-x3)
        k4=(y1-y4)/(x1-x4)
        return k1,k2,k3,k4

然後計算每個位置上的各個函式值

                l1=int(tk1*(i-tx1)+ty1)
                l2=int(tk2*(i-tx2)+ty2)
                l3=int(tk3*(i-tx3)+ty3)
                l4=int(tk4*(i-tx4)+ty4)

判斷條件很重要,因為左邊是那樣排列的,所以判斷條件就是

(l1<=j)&(l2>=j)&(l3>=j)&(l4<=j)

也就是在紅色區域中任取一點都滿足這個條件。定義一個全域性變數,滿足條件就+1。面積就求出來了。

其實求面積並不是我的目的

2.求相交的面積

兩個面積分別求出來以後,兩個面積的交集面積最簡單的可以通過對照兩個區域的座標進行求解。

也就是在分別計算兩個面積的時候記下符合條件的座標(x,y)存放到陣列中,最後比較兩個陣列中相等的元素的個數即可求解。

3.並面積

交的面積計算完後,可以用下面的公式(S1:四邊形1的面積、S2:四邊形2的面積、iu:交面積)

並面積=S1-iu+S2

4.IOU

交面積/並面積

5.測試

(1)

(2)

(3)

可以看到最後一種情況紅框已經把ground truth包含了,所以可以直接用S2/S1來檢驗演算法的準確性

而13882/19307=0.719013829181126,可以證明演算法的準確性。

測試程式碼:連結

和別的演算法進行比較

還是有區別的。。。

v2是向量方法計算

v3是shapely包計算