積分圖(一) - 原理及應用

積分圖原理

第一個提出 Haar 特徵快速計算方法的是 CVPR2001上 的那篇經典論文 [《Rapid object detection using a boosted cascade of simple features》] (http://www.cs.utexas.edu/~grauman/courses/spring2007/395T/papers/viola_cvpr2001.pdf), Viola 提出了一種利用積分圖(integral image)快速計算 Haar 特徵的方法, 這個方法使得圖像的局部矩形求和運算的複雜度從 O(MN) 降低到了 O(4)html

Haar 特徵的計算須要重複計算目標區域的像素值,使用積分圖能大大減小計算量,達到實時計算 Haar 特徵的目的。簡單來講,就是先構造一張「積分圖」(integral image),也叫 Summed Area Table,以後任何一個 Haar 矩形特徵均可以經過查表的方法(Look Up Table)和有限次簡單運算獲得,大大減小了運算次數。因此但凡須要重複計算目標區域內像素值和的場合,積分圖都能派上用場。下面開始介紹積分圖原理,並給出其的幾個應用。算法

一、積分圖原理  

圖像是由一系列的離散像素點組成, 所以圖像的積分其實就是求和. 圖像積分圖中每一個點的值是原圖像中該點左上角的全部像素值之和.spring

首先創建一個數組 A 做爲積分圖像,其寬高與原圖像相等. 而後對這個數組賦值,每一個點存儲的是該點與圖像原點所構成的矩形中全部像素的和:api

\[\begin{equation}\begin{aligned} SAT(x, y) = \sum_{x_i \leq x, y_i \leq y}{I(x_i, y_i)} \end{aligned}\end{equation}\]數組

其中 \(I(x,y)\) 表示圖像 (x,y) 位置的像素值。積分圖像能夠採用增量的方式計算:優化

\[\begin{equation}\begin{aligned} SAT(x, y) = SAT(x, y-1) + SAT(x-1, y) - SAT(x-1, y-1) + I(x,y) \end{aligned}\end{equation}\]spa

初始邊界:$ SAT(-1,y) = SAT(x,-1) = SAT(-1,-1) = 0 $翻譯

爲了更好地說明這個等式,下面我用幾幅圖來講明:設計

圖1.座標(x,y)處在原圖像中示例3d

圖2.座標(x,y-1)處的積分圖像SAT(x,y-1)示例

圖3.座標(x-1,y)處的積分圖像SAT(x-1,y)示例

圖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的積分 \(SAT_1=Sum(Ra)\)
點2的積分 \(SAT_2=Sum(Ra)+Sum(Rb)\)
點3的積分 \(SAT_3=Sum(Ra)+Sum(Rc)\)
點4的積分 \(SAT_4=Sum(Ra)+Sum(Rb)+Sum(Rc)+Sum(Rd)\)

那麼爲了計算某個矩形像素和,好比區域 Rd 內全部點的像素值之和(積分)能夠表示爲:

\[\begin{equation}\begin{aligned} Sum(Rd)=SAT_1+SAT_4-SAT_2-SAT_3 \end{aligned}\end{equation}\]

因此不管矩形的尺寸大小,只需查找積分圖像 4 次就能夠快速計算任意矩形內像素值的和, 即算法複雜度爲 O(4)。

二、積分圖應用

2.1 Haar-like特徵值計算

以以下一種 Haar-like 邊緣特徵爲例

假設須要計算的這種 Haar-like 特徵在圖中的位置以下所示:

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

\[\begin{equation}\begin{aligned} Harr_{A-B} &= Sum(A) - Sum(B) \\ &= [SAT_4+SAT_1-SAT_2-SAT_3] - [SAT_6+SAT_3-SAT_4-SAT_5] \end{aligned}\end{equation}\]

顯然,對一個灰度圖而言,事先將其積分圖構建好,當須要計算灰度圖某個區域內全部像素點的像素值之和的時候,利用積分圖,經過查表運算,能夠迅速獲得結果。

2.2 使用積分圖像實現自適應閾值化

自適應閾值是一種局部方法。它的原理是根據每一個像素的鄰域(如 5x5)計算閾值,如將每一個像素的值與指定的鄰域的平均值進行比較,若是某像素的值與它的局部平均值差異很大,就會被看成異常值在閾值化過程當中被分離。

如若不採用積分圖像,則每一個像素比較時,都須要進行 5 x 5 次加法運算;而採用積分圖像,運算複雜度不隨鄰域大小而改變,每次只需計算 2 次加法和 2 次減法。

2.3 Boxfilter 快速計算

積分圖可使複雜度爲O(MN)的求和, 求方差等運算下降到O(1)或近似於O(1)的複雜度,但它的缺點是不支持多尺度。

Boxfilter 的原理有點相似 Integral Image,並且比它還要快,可是實現步驟比較複雜。在計算矩形特徵以前,Boxfilter 與 Integral Image 都須要對圖像進行初始化(即對數組A賦值), 不一樣於 Integral Image, Boxfilter 的數組 A 中的每一個元素的值是該像素鄰域內的像素和(或像素平方和), 在須要求某個矩形內像素和的時候,直接訪問數組中對應的位置就能夠了。所以能夠看出它的複雜度是O(1)。

Boxfilter 的細節能夠移步這裏.

2.4 滑動窗口

其實就是上面的 Boxfilter 中使用的方法.

我本人在作車牌字符分割時,設計了一個動態模板在車牌圖像上滑動,而且每次滑動都計算一次模板內包含的非零像素點個數,沒用積分圖的時候,每次計算都要遍歷,效率真的過低,滑動 1000 屢次,計算耗時竟達到了幾百 ms,這在實時處理中是不能容忍的。然後去補了積分圖的知識,使用積分圖來計算每次滑動後區域內的非零像素點個數,效率不要過高,只耗費了幾 ms 就完事了。深深感嘆算法的博大精深!

參考

[1]: 積分圖原理及應用
[2]: 極限優化:Haar特徵的另外一種的快速計算方法—boxfilter
[3]: Viola–Jones, object detection framework--Rapid Object Detection using a Boosted Cascade of Simple Features中文翻譯 及 matlab 實現(見文末連接)

相關文章
相關標籤/搜索