积分图是图像中十分经常使用的方法,最初是在Haar特征的快速计算中学到(参考博文:利用积分图像法快速计算Haar特征),后来发如今均值滤波,二值化等图像处理方法中也十分常见。spa
积分图的简要介绍能够参考博文:利用积分图像法快速计算Haar特征,这里再也不重复了。本篇主要是小记一下积分图的计算方法。.net
因为积分图中每一个单元存储的信息是原图中此位置左上角全部像素之和,因此对一张W*H的图像直接求取积分图,须要:code
(1+2+...+W-1)*H+(1+2+...+W)*(H=1) = (w-2)*H/(W-1)+2(W+1)*(H-1)/W blog
次加法。get
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 ; }