1. 程式人生 > >10年後再看Robust Real-Time Face Detection(二) 之積分圖

10年後再看Robust Real-Time Face Detection(二) 之積分圖

   我們知道, 如果採用Naive 的方法去計算矩形特徵值是相當的麻煩和不現實的。 所以論文中作者引用了積分圖的概念, 那麼這樣我們只需要常數的時間內就可以計算任何一個矩形區域覆蓋的畫素灰度值之和。 那麼什麼是積分圖(Integral Image)呢?

   積分, 故名思議, 在離散域中就是求和之意。 對一幅影象而言,  該影象在(x, y)處的積分值就是該位置處左上方所有的畫素求和,得到的值在賦給這一位置處(注意, 對影象而言, 座標原點是在影象的最左上角處, 水平位x軸, 豎直方向為y 軸)。數學表示式如下:


其中, ii (x, y) 是積分圖在(x, y)處的值。 i (x, y) 是原始影象。 該公式說明, 給定影象i (x, y), 我們可以計算與此幅影象對應的唯一的積分圖ii (x, y)。 注意積分圖存在的意義就在於允許我們快速的計算出某一矩形覆蓋的所有元素之和。


上面只是給出了積分圖的定義。 實際上在程式設計計算積分圖的時候, 我們用到了如下的遞迴公式(建議一定要理解, 畫圖表示一下就明白了):


其中, s(x, y)的含義是對原影象按行累加和(cumulative row sum), 注意我們定義邊界條件s(x,−1) =0, ii (−1, y) = 0)。也就是說, 我們只需要在原始影象上一輪迴圈就可以計算出原始影象的積分圖, 非常高效。

一旦我們求出了積分圖, 我們 就可以快速求出任何一個矩形匡覆蓋的畫素值之和, 當然我們也就可以快速的求出矩形特徵值(只是矩形的元素求和後, 再相加減, 就可以求出相應的矩形特徵值):


 為了更好的理解計算的過程, 下面給出找到的一個具體的例子(注意積分圖邊界上補0):


上圖中, 左邊的為原始影象, 右邊的影象為從左邊原始影象計算得到積分影象(只需對原始影象A先行求和(逐行累加)的B, 在對得到的B影象逐列累加即可得到積分影象)。 注意積分圖左邊界和上邊界上補的0值。

不難求出, 上面那個矩形的面積為: 15 + 0 - 10 - 0 = 5

下面那個矩形面積: 30 + 0 - 0 - 17 = 13(具體分析方法如下):