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


積分圖原理

第一個提出 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)

Haar 特征的計算需要重復計算目標區域的像素值,使用積分圖能大大減少計算量,達到實時計算 Haar 特征的目的。簡單來說,就是先構造一張“積分圖”(integral image),也叫 Summed Area Table,之后任何一個 Haar 矩形特征都可以通過查表的方法(Look Up Table)和有限次簡單運算得到,大大減少了運算次數。所以但凡需要重復計算目標區域內像素值和的場合,積分圖都能派上用場。下面開始介紹積分圖原理,並給出其的幾個應用。

1、積分圖原理

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

首先建立一個數組 A 作為積分圖像,其寬高與原圖像相等. 然后對這個數組賦值,每個點存儲的是該點與圖像原點所構成的矩形中所有像素的和:

\[\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}\]

初始邊界:$ 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-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、積分圖應用

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 就完事了。深深感嘆算法的博大精深!

參考

[3]: Viola–Jones, object detection framework--Rapid Object Detection using a Boosted Cascade of Simple Features中文翻譯 及 matlab 實現(見文末鏈接)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM