之所以要寫這篇文章,主要是想從Matlab函數的角度給大家一個對EMD直觀的理解。EMD是在一定的條件限制下求解最小代價作爲直方圖等向量的距離。EMD具體內容請參考我第一篇文章。而求解最小代價的過程就是個線性規劃問題。
一、Matlab函數解釋
這裏借用的Matlab函數爲linprog(),即求解線性規劃的函數。下面爲了讓大家理解方便,signature的表達嚴格對應了直方圖的bin,也就是說一點都不壓縮直方圖,每個bin就作爲一個signature,所以數據量顯得大了些。例如直方圖有32個bin,那麼signature就是 (1, w1), (2, w2), (3, w3).... (32, w32),w值爲每個bin的數量。
matlab的這個函數我的調用方式爲:linprog(f, A, b, Aeq, beq),解釋如下:
1)函數的目的是求 fT * x的最小值,一定要注意,這裏的f相當於上一篇中EMD的距離矩陣D,x相當於EMD的fij,即從一個直方圖的第i個bin流到另一個直方圖的第j個bin的數量。 由於這個函數的輸入f是一維的,下面我把EMD的距離dij和fij都展開。
2)一個限制條件爲 A * x <= b
3)另一個限制條件是Aeq * x = beq
二、實例
下面根據一個例子問題構建這個輸入數據。
1) 數據:6個bin的一維直方圖的EMD距離- 直方圖1:[100 0 0 0 120 0]
- 直方圖2:[0 100 0 0 0 120]
- 可以直觀的看到,這兩個直方圖其實很像,只是錯位了一列而已,而實際的圖像也會比較相似。造成這種問題也許是圖像的光照發生了一丁點的變化使得像素值給量化到緊鄰的bin裏了。高大上的EMD應該是100挪到第二個bin,120挪到最後一個bin,代價會最小。下面用線性規劃驗證這個情況。
2) matlab函數的f對應EMD公式中的d,即代價。x即EMD中的fij。由於EMD中條件不等式中只是對fij的求和限制,相當於權值爲1,所以matlab調用中的A中的對應這部分限制條件的有效部分應該是全1。
3) matlab函數的輸入參數f的生成:
- 對於顏色空間來說,距離即是bin的歐幾里得距離。這裏由於是一維直方圖,距離可以記爲bin的序號的差的絕對值。(如果用bin所對應的顏色值範圍的中心,只是一個線性變化問題,不影響結果)
f =
0 1 2 3 4 5
1 0 1 2 3 4
2 1 0 1 2 3
3 2 1 0 1 2
4 3 2 1 0 1
5 4 3 2 1 0
- matlab函數解決的是一維向量計算,所以把上述EMD計算公式打開成一維,
[0 1 2 3 4 5 1 0 1 2 3 4 2 1 0 1 2 3 3 2 1 0 1 2 4 3 2 1 0 1 5 4 3 2 1 0]
4) A的生成,稍微複雜些,它需要表達EMD公式條件中的兩個對fij求和的小於等於的不等式(每套不等式都包含bin的個數的判斷,即6)。由於把二維向量展開了,fij本身爲包含36個元素的一維向量。那麼爲了表達兩個不等式,需要加入12*36維矩陣,每一行對應一個不等式。另外還有第一個不等式即每個fij都要大於等於0,也要融入到A中。
- 第一個不等式:把36列分爲6段,每一行賦給其中一段爲全1,其他全0
- 第二個不等式:交織的方式賦值,即第7行:1 0 0 0 0 0 1 0 0 0 0 0 1.....;第8行:0 1 0 0 0 00 1 0 0 0 0 0 1 ....,
- 注意上述兩個不等式的賦值對應於對i和j的求和。
- 限制每個fij都不小於0很簡單,但是它是限制36個搬移量的每一個,所以有36個不等式,所以A中還需要加入36x36的矩陣,每一行去計算某一個搬移量,也就是其中一個位置賦-1(負1使EMD公式中的大於號改變成小於號),其他全零。
5) b的賦值:基於A的賦值,可以很直觀的看到,b中第一部分6個值爲第一個直方圖的每個bin的值,第二部分6個值爲第二個直方圖的每個bin的值;第三部分36個值爲0,那麼總共b的元素數量爲6+6+36=48。
6) Aeq簡單的設置爲1x36,所有全爲1(EMD等式中的求和沒有權值)
7) beq則爲一個直方圖所有bin的求和。雖然EMD的條件公式中是求兩個直方圖求和的最小值,但是由於兩個直方圖的情況相同,這裏計算結果爲beq=220
8) 調用函數:[x, fval] = linprog(frow, A, b, Aeq, beq),得到結果
- x = -0.0000 100.0000 -0.0000 0.0000 0.0000 0.0000 -0.0000 -0.0000 -0.0000 -0.0000 -0.0000 0.0000 0.0000 0.0000 -0.0000 -0.0000 -0.0000 0.0000 -0.0000 0.0000 -0.0000 -0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 120.0000 -0.0000 0.0000 -0.0000 -0.0000 -0.0000 0.0000。 可以發現x中只有兩個非零值,100, 120,也就是隻有兩個有效的搬移。
- fval = 220,即代價。這裏的輸入使用的是WORK而不是歸一化後的EMD。這個fval即爲最小化的WORK。可以直觀的看到,相當於前述的兩次搬移,搬移距離1,總移動數量爲(100+120),即220。
三、Matlab代碼實現
%相當於求和 i
A = zeros(12+36, 36);
for i=1:6
A(i, (i-1)*6+1 : i*6) = 1;
end
% 相當於求和 j
for i=1:6
for j=0:5
A(i+6, j*6+i) = 1;
end
end
for i=1:36
A(i+12, i)= -1;
end
Aeq = ones(1, 36);
beq = 220;
f = [0 1 2 3 4 5; 1 0 1 2 3 4; 2 1 0 1 2 3;3 2 1 0 1 2; 4 3 2 1 0 1;5 4 3 2 1 0];
frow=[f(1,:) f(2,:) f(3,:) f(4,:) f(5,:) f(6,:)];
b = zeros(12+36,1);
b(1:12,1) = [100 0 0 0 120 0 0 100 0 0 0 120]';
[x, fval] = linprog(frow, A, b, Aeq, beq)
相信到此爲止,大家應該對EMD有個比較直觀的認識了 :)