目录(?)[+]
积分图是图像中十分常用的方法,最初是在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
次加法。
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 ; }
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 ; }