积分图像

参考博客:https://www.cnblogs.com/magic-428/p/9149868.html

1、积分图原理

积分图的每一点(xy)的值是原图中对应位置的左上角区域的所有值得和:[6] [7]

{\displaystyle I(x,y)=\sum _{\begin{smallmatrix}x'\leq x\\y'\leq y\end{smallmatrix}}i(x',y')}

而且,积分图可以只遍历一次图像即可有效的计算出来,因为积分图每一点的(xy)值是:

{\displaystyle I(x,y)=i(x,y)+I(x-1,y)+I(x,y-1)-I(x-1,y-1)\,}
 
计算矩形阴影区域的值

一旦积分图计算完毕,对任意矩形区域的和的计算就可以在常数时间内完成。如上图中,阴影矩形区域的值:

{\displaystyle \sum _{\begin{smallmatrix}A(x)<x'\leq C(x)\\A(y)<y'\leq C(y)\end{smallmatrix}}i(x',y')=I(C)+I(A)-I(B)-I(D).}

2、积分图应用

2.1 Haar-like特征值计算

以如下一种 Haar-like 边缘特征为例

假设需要计算的这种 Haar-like 特征在图中的位置如下所示:

那么,A,B区域所构成的 Haar-like 边缘特征是:

 

HarrAB=Sum(A)Sum(B)=[SAT4+SAT1SAT2SAT3][SAT6+SAT3SAT4SAT5](4)(4)HarrA−B=Sum(A)−Sum(B)=[SAT4+SAT1−SAT2−SAT3]−[SAT6+SAT3−SAT4−SAT5]

 

显然,对一个灰度图而言,事先将其积分图构建好,当需要计算灰度图某个区域内所有像素点的像素值之和的时候,利用积分图,通过查表运算,可以迅速得到结果。

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 中使用的方法.

在车牌字符分割时,设计了一个动态模板在车牌图像上滑动,并且每次滑动都计算一次模板内包含的非零像素点个数,使用积分图来计算每次滑动后区域内的非零像素点个数,效率非常高。

posted @ 2019-05-24 14:31  andyalgorithm  阅读(1020)  评论(1编辑  收藏  举报