Paul Viola提出一種利用積分圖快速計算Haar特征的方法(《Rapid object detection using a boosted cascade of simple features》)。Haar特征是什么就不多做介紹,總之Haar特征的計算需要重復計算目標區域的像素值,使用積分圖能大大減少計算量,達到實時計算Haar特征的目的。簡單來說,就是先構造一張“積分圖”(integral image),也叫Summed Area Table,之后任何一個Haar矩形特征都可以通過查表的方法(Look Up Table)和有限次簡單運算得到,大大減少了運算次數。所以但凡需要重復計算目標區域內像素值和的場合,積分圖都能派上用場。下面開始介紹積分圖原理,並給出其的幾個應用。
1、積分圖原理
將矩形表示為:
![]()
其中,x,y表示坐標,w,h表示寬、高,a表示角度。
積分圖像中,每個點存儲的是其左上方所有像素之和:


其中I(x,y)表示圖像(x,y)位置的像素值。積分圖像可以采用增量的方式計算:

初始邊界:SAT(-1,y)=SAT(x,-1)=SAT(-1,-1)=0
為了更好地說明這個等式的緣由,下面我用幾幅圖來說明:
圖1.坐標(x,y)處在原圖像中示例 圖2.坐標(x,y-1)處的積分圖像SAT(x,y-1)示例

圖3.坐標(x-1,y)處的積分圖像SAT(x,y-1)示例 圖4.坐標(x-1,y-1)處的積分圖像SAT(x-1,y-1)示例
可以看到,SAT(x,y-1)+SAT(x,y-1)后,有一部分重合的區域,即SAT(x-1,y-1),所以需減掉,最后還需要將當前坐標(x,y)的像素值I(x,y)包含進來。
定義了積分圖的概念,就可以很方便的計算任意區域內的像素和,如下圖所示:

所以,
點1的積分SAT1=Sum(Ra),
點2的積分SAT2=Sum(Ra)+Sum(Rb),
點3的積分SAT3=Sum(Ra)+Sum(Rc),
點4的積分SAT4=Sum(Ra)+Sum(Rb)+Sum(Rc)+Sum(Rd)
那么,區域Rd內所有點的像素值之和(積分)可以表示為:
Sum(Rd)=SAT1+SAT4-SAT2-SAT3
所以無論矩形的尺寸大小,只需查找積分圖像4次就可以求得任意矩形內像素值的和。
2、積分圖應用
(1)Haar-like特征值計算
以如下一種Haar-like邊緣特征為例

假設需要計算的這種Haar-like特征在圖中的位置如下所示:

那么,A,B區域所構成的Haar-like邊緣特征是:

顯然,對一個灰度圖而言,事先將其積分圖構建好,當需要計算灰度圖某個區域內所有像素點的像素值之和的時候,利用積分圖,通過查表運算,可以迅速得到結果。
(2)使用積分圖像實現自適應閾值化
自適應閾值是一種局部方法。它的原理是根據每個像素的鄰域(如5x5)計算閾值,如將每個像素的值與指定的鄰域的平均值進行比較,如果某像素的值與它的局部平均值差別很大,就會被當作異常值在閾值化過程中被分離。
如若不采用積分圖像,則每個像素比較時,都需要進行5x5次加法運算;而采用積分圖像,運算復雜度不隨鄰域大小而改變,每次只需計算2次加法和2次減法。
(3)
我本人在做車牌字符分割時,設計了一個動態模板在車牌圖像上滑動,並且每次滑動都計算一次模板內包含的非零像素點個數,沒用積分圖的時候,每次計算都要遍歷,效率真的太低,滑動1000多次,計算耗時竟達到了幾百ms,這在實時處理中是不能容忍的。而后去補了積分圖的知識,使用積分圖來計算每次滑動后區域內的非零像素點個數,效率不要太高,只耗費了幾ms就完事了。深深感嘆算法的博大精深!
以上。
