快速计算积分图

【图像处理】快速计算积分图

分类: 【算法分析】 【机器视觉】 【图像处理】 2001人阅读 评论(13) 收藏 举报

目录(?)[+]

  1. 一种简单的快速计算方法
  2. 改进的快速计算方法
    1. 转载请注明作者和出处httpblogcsdnnetxiaowei_cqu未经允许请勿用于商业用途

积分图是图像中十分常用的方法,最初是在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特征的方法。
快速计算积分图_第1张图片
即,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 print ?
  1. void integral(unsigned char* inputMatrix, unsigned long* outputMatrix, int width, int height){
  2. // calculate integral of the first line
  3. for(int i=0;i<width;i++){
  4. outputMatrix[i] = inputMatrix[i];
  5. if(i>0){
  6. outputMatrix[i] += outputMatrix[i-1];
  7. }
  8. }
  9. for (int i=1;i<height;i++){
  10. int offset = i*width;
  11. // first column of each line
  12. outputMatrix[offset] = outputMatrix[offset-width]+inputMatrix[offset];
  13. // other columns
  14. outputMatrix[offset+j] = outputMatrix[offset+j-1] + outputMatrix[offset-width] + outputMatrix[offset-width-1] + inputMatrix[offset];
  15. }
  16. }
  17. return ;
  18. }

改进的快速计算方法

通过观察上一种方法,发现积分Integral(i,j) 并不需要由三个位置的积分计算出来,只需要左边Integral(i,j-1)加上当前列的和即可。
快速计算积分图_第2张图片
即,Integral(i,j) = Integral(i,j-1) + ColumnSum(j);
因此,对一张W*H的图像直接求取积分图,只需要:
(W-1)+(H-1)+2*(W-1)*(H-1)
次加法。代码如下:
[cpp] view plain copy print ?
  1. void fastIntegral(unsigned char* inputMatrix, unsigned long* outputMatrix, int width, int height){
  2. unsigned long *columnSum = new unsigned long[width]; // sum of each column
  3. // calculate integral of the first line
  4. for(int i=0;i<width;i++){
  5. columnSum[i]=inputMatrix[i];
  6. outputMatrix[i] = inputMatrix[i];
  7. if(i>0){
  8. outputMatrix[i] += outputMatrix[i-1];
  9. }
  10. }
  11. for (int i=1;i<height;i++){
  12. int offset = i*width;
  13. // first column of each line
  14. columnSum[0] +=inputMatrix[offset];
  15. outputMatrix[offset] = columnSum[0];
  16. // other columns
  17. for(int j=1;j<width;j++){
  18. columnSum[j] += inputMatrix[offset+j];
  19. outputMatrix[offset+j] = outputMatrix[offset+j-1] + columnSum[j];
  20. }
  21. }
  22. return ;
  23. }

你可能感兴趣的:(【图像处理】,【算法分析】,【机器视觉】)