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)和有限次簡單運算獲得,大大減小了運算次數。因此但凡須要重複計算目標區域內像素值和的場合,積分圖都能派上用場。下面開始介紹積分圖原理,並給出其的幾個應用。算法
一、積分圖原理api
將矩形表示爲:spa
其中,x,y表示座標,w,h表示寬、高,a表示角度。設計
積分圖像中,每一個點存儲的是其左上方全部像素之和:3d
其中I(x,y)表示圖像(x,y)位置的像素值。積分圖像能夠採用增量的方式計算:blog
初始邊界:SAT(-1,y)=SAT(x,-1)=SAT(-1,-1)=0io
爲了更好地說明這個等式的原因,下面我用幾幅圖來講明:模板
圖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次就能夠求得任意矩形內像素值的和。
二、積分圖應用
(1)Haar-like特徵值計算
以以下一種Haar-like邊緣特徵爲例
假設須要計算的這種Haar-like特徵在圖中的位置以下所示:
那麼,A,B區域所構成的Haar-like邊緣特徵是:
顯然,對一個灰度圖而言,事先將其積分圖構建好,當須要計算灰度圖某個區域內全部像素點的像素值之和的時候,利用積分圖,經過查表運算,能夠迅速獲得結果。
(2)使用積分圖像實現自適應閾值化
自適應閾值是一種局部方法。它的原理是根據每一個像素的鄰域(如5x5)計算閾值,如將每一個像素的值與指定的鄰域的平均值進行比較,若是某像素的值與它的局部平均值差異很大,就會被看成異常值在閾值化過程當中被分離。
如若不採用積分圖像,則每一個像素比較時,都須要進行5x5次加法運算;而採用積分圖像,運算複雜度不隨鄰域大小而改變,每次只需計算2次加法和2次減法。
(3)
我本人在作車牌字符分割時,設計了一個動態模板在車牌圖像上滑動,而且每次滑動都計算一次模板內包含的非零像素點個數,沒用積分圖的時候,每次計算都要遍歷,效率真的過低,滑動1000屢次,計算耗時竟達到了幾百ms,這在實時處理中是不能容忍的。然後去補了積分圖的知識,使用積分圖來計算每次滑動後區域內的非零像素點個數,效率不要過高,只耗費了幾ms就完事了。深深感嘆算法的博大精深!
以上。