随笔 - 909  文章 - 0  评论 - 16  阅读 - 60万

【算法设计】快速计算积分图

积分图是图像中十分常用的方法,最初是在Haar特征的快速计算中学到(参考博文:利用积分图像法快速计算Haar特征),后来发现在均值滤波,二值化等图像处理方法中也十分常见。

积分图的简要介绍可以参考博文:利用积分图像法快速计算Haar特征,这里不再重复了。本篇主要是小记一下积分图的计算方法。

由于积分图中每个单元存储的信息是原图中此位置左上角所有像素之和,所以对一张W*H的图像直接求取积分图,需要:

(1+2+...+W-1)*H+(1+2+...+W)*(H=1) = (w-2)*H/(W-1)+2(W+1)*(H-1)/W 

次加法。

 

一种简单的快速计算方法

最直接的快速计算方法是利用以计算积分求当前位置的积分,其思想正如快速计算Haar特征的方法。

即,Integral(i,j) = Integral(i,j-1) + Integral(i-1,j) - Integral(i-1,j-1) + Image(i,j);
于是,对一张W*H的图像直接求取积分图,需要:
(W-1)+(H-1)+3*(W-1)*(H-1)
次加法。代码如下:
void integral(unsigned char* inputMatrix, unsigned long* outputMatrix, int width, int height){
	// calculate integral of the first line
	for(int i=0;i<width;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
		outputMatrix[offset] = outputMatrix[offset-width]+inputMatrix[offset];
	    // other columns 
			outputMatrix[offset+j] = outputMatrix[offset+j-1] + outputMatrix[offset-width] + outputMatrix[offset-width-1] + inputMatrix[offset]; 
		}
	}
	return ;
}

改进的快速计算方法

通过观察上一种方法,发现积分Integral(i,j) 并不需要由三个位置的积分计算出来,只需要左边Integral(i,j-1)加上当前列的和即可。

即,Integral(i,j) = Integral(i,j-1) + ColumnSum(j);
因此,对一张W*H的图像直接求取积分图,只需要:
(W-1)+(H-1)+2*(W-1)*(H-1)
次加法。代码如下:
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 ;
}

(转载请注明作者和出处:http://blog.csdn.net/xiaowei_cqu 未经允许请勿用于商业用途)



 

posted on   我的小人生  阅读(954)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示