积分图(一) - 原理及应用

积分图原理

第一个提出 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 实现(见文末连接)

相关文章
相关标签/搜索