【图像处理】快速计算积分图
2018-01-11 09:55
369 查看
原文链接:http://blog.csdn.net/xiaowei_cqu/article/details/17928733
积分图是图像中十分常用的方法,最初是在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)
次加法。代码如下:
[cpp] view
plain copy
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)
次加法。代码如下:
[cpp] view
plain copy
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 ;
}
积分图是图像中十分常用的方法,最初是在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)
次加法。代码如下:
[cpp] view
plain copy
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)
次加法。代码如下:
[cpp] view
plain copy
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 ;
}
相关文章推荐
- 【图像处理】利用积分图像法快速计算Haar特征
- 【图像处理】快速计算积分图
- 【图像处理】利用积分图像法快速计算Haar特征
- 【图像处理】快速计算积分图
- 图像处理之积分图应用二(快速边缘保留滤波算法)
- 图像处理之积分图应用三(基于NCC快速相似度匹配算法)
- 【人脸检测:Haar】利用积分图像法快速计算Haar特征(二)
- 图像处理之积分图应用一(半径无关的快速模糊算法)
- 图像处理之积分图应用二(快速边缘保留滤波算法)
- 【图像处理】所谓的“快速积分图”,其实并不快
- 关于医学图像处理中钙化积分的计算
- 图像处理之基础---卷积函数积分的计算和性质
- 【Paper】利用积分图像法快速计算Haar特征
- 利用积分图像法快速计算Haar特征
- 二、利用积分图像法快速计算Haar特征
- 利用积分图像法快速计算Haar特征
- [占坑] 图像处理中计算积分图使用类似dp的方法而不用树状数组的原因
- 利用积分图像法快速计算Haar特征
- 图形图像处理-之-任意角度的高质量的快速的图像旋转 上篇 纯软件的任意角度的快速旋转
- GPU高性能计算与图像处理