图像处理之图像积分图integral()

图像处理之图像积分图integral()

1、图像积分图算法:积分图像是Crow在1984年首次提出,是为了在多尺度透视投影中提高渲染速度,是一种快速计算图像矩形区域和与矩形区域平方和的算法。这种算法的主要优点是一旦积分图像首先被计算出来,我们就可以在常量时间内计算图像中任意大小矩形区域的和。这样在图像模糊、边缘提取、对象检测的时候极大降低计算量、提高计算速度。

2、作用:当需要多次重复对像素值进行计算时,利用积分图可以大大减少计算量、提高计算速度。

3、什么是积分图:图像是由一系列的离散像素点组成,因此图像的积分其实就是求和。【图像积分图中每个点的值是原图像中该点左上角的所有像素值之和。】
积分图中任意一点(x,y)的值等于灰度图的左上角与当前点所围成的矩形区域内所有像素点灰度值之和。(下左图蓝色虚线框部分)

其核心思想是对每个图像建立自己的积分图查找表,在图像积分处理计算阶段根据预先建立的积分图查找表,直接查找从而实现对均值卷积线性时间计算,做到了卷积执行的时间与半径窗口大小的无关联。

图像积分图在图像特征提取 HAAR/SURF、二值图像分析、图像相似相关性NCC计算、图像卷积快速计算等方面均有应用,是图像处理中的经典算法之一。

图像积分图建立与查找在积分图像(Integral Image - ii)上任意位置(x, y)处的ii(x, y)表示该点左上角所有像素之和, 其中(x,y)是图像像素点坐标。

4、如何利用积分图快速计算灰度值?

如上图所示:若要利用积分图求原图中紫色区域的灰度和,则在积分图中找到对应区域(积分图中的紫色区域),

公式为:A+C-B-D = 12+1-4-4 = 5。

5、如何去理解积分图尺寸为(W+1)*(H+1),并且第0行和第0列的积分图值都是0 ?

原图上每一个网格的节点左上方的像素点灰度和为当前点的积分图,所以如上图所示原图上第0行第0列的‘1’左上角节点处的灰度和为0,因此对应积分图上为0,以此类推; 从另一个角度去理解和验证:用上述公式 A+C-B-D去套用任意一个像素点都适用,但如果没有第0行和第0列都为0,这个公式就不能用在每一个像素点上了。

6、注意:原图为W*H,积分图大小则为(W+1)*(H+1),积分图的第0行和第0列必须初始化为0。

7、积分图的优化算法简介

(1)原始方案: Integral(i, j)=Integral(i, j−1)+Integral(i−1, j)−Integral(i−1, j−1)+I(i, j)

对一张W*H的图像直接求取积分图,需要:(W-1)+(H-1)+3*(W-1)*(H-1) 次加法。

(2)优化方案1: Integral(i,j) = Integral(i,j-1) + ColumnSum(j);

对一张W*H的图像直接求取积分图,需要:(W-1)+(H-1)+2*(W-1)*(H-1) 次加法, 但需要多一个大小为W的内存来更新保存每一列相应的累计和 。

void fastIntegral(unsigned char* inputMatrix, unsigned long* outputMatrix, int width, int height)
{
	unsigned long *columnSum = new unsigned long[width]; // sum of each column
	// calculate integral of the first line
	for(int i=0;i<width;i++)
    {
		columnSum[i]=inputMatrix[i];
		outputMatrix[i] = inputMatrix[i];
		if(i>0)
        {
			outputMatrix[i] += outputMatrix[i-1];
		}
	}
	for (int i=1;i<height;i++)
    {
		int offset = i*width;
		// first column of each line
		columnSum[0] +=inputMatrix[offset];
		outputMatrix[offset] = columnSum[0];
		 // other columns 
		for(int j=1;j<width;j++)
        {
			columnSum[j] += inputMatrix[offset+j];
			outputMatrix[offset+j] = outputMatrix[offset+j-1] + columnSum[j]; 
		}
	}
	return ;
}

(3)优化方案2: Integral(i,j) = Integral(i-1,j) + ColumnSum(i);

对一张W*H的图像直接求取积分图,需要:(W-1)+(H-1)+2*(W-1)*(H-1) 次加法, 只需要申请一个变量来更新保存每一行相应的累计和。

【成功最终属于耐心准备&等待的人。】

猜你喜欢

转载自blog.csdn.net/yishuihanq/article/details/108619478