共同的目的:
当需要重复计算图像的不同区域的和、均值、方差等等的时候,就可以想到积分图或者Boxfiler来加速图像处理的过程。它可以使复杂度为O(MN)的求和,求方差等运算降低到O(1)或近似于O(1)的复杂度,它的缺点是不支持多尺度。
例如:下面图像中每个方框表示一个像素,我现在需要计算红色方框中所有像素的和。
被选中框为4x4,那么计算和的话复杂度为O(4x4)。
现在,我想计算不定矩形框、不定次数的和的话,其复杂度就会非常高,如下图。
integral image(积分图)
那么首先,我们来看积分图是怎么加速的:
它的原理很简单:首先建立一个数组A,宽高与原图像相等,然后对这个数组赋值,每个元素的值A[i]赋为该点与图像原点所构成的矩形中所有像素的和。初始化之后,想要计算某个矩形像素和的时候可以采用如下方法:如图D矩形的像素和就等于A[4] – A[2] – A[3] + A[1],共4次运算,即O(4)。Integral Image极大的提高了Haar特征的计算速度,它的优点在于能够快速计算任意大小的矩形求和运算。
boxfilter
boxfiler从原来上来说,它比积分图更快。
但是:boxfiler的缺点在于,它只能得到固定矩形框的和。
原理:
Boxfilter的初始化过程如下:
1、给定一张图像,宽高为(M,N),确定待求矩形模板的宽高(m,n),如图紫色矩形。图中每个黑色方块代表一个像素。
2、先求出绿色矩形框中每一列的和。注意:这个矩形框是(3*3)或者其他大小的滤波框。将每一列的值保存在一个新的数组内,以红色像素表示。如下图的蓝色的蓝色框为例。
3、之后列框就会遍历整个图像,得到新的保存所有列框之和的数组。
4、如果想得到某个区域范围内的和,只需要加上所有选中的红色像素内的值就可以了。