zoukankan      html  css  js  c++  java
  • 【算法设计】快速计算积分图

    积分图是图像中十分常用的方法,最初是在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 未经允许请勿用于商业用途)



  • 相关阅读:
    git提交到了错误的分支,如何解决
    js使用 isNumber() 判断是否是数字,要注意NaN
    prettier 出现 Couldn't resolve parser "babylon" 错误的解决方法
    在AWS CloudWatch中使用Logs Insights查询错误日志
    腾讯智能对话平台TBP 返回的数据结构
    python 中在使用f string 格式化字符串时出现ValueError: Invalid format specifier 的一种原因
    冒泡排序
    第一次摸底考试总结
    用for循环打印99乘法表
    数据库编写 数据库常用约束
  • 原文地址:https://www.cnblogs.com/fuhaots2009/p/3509105.html
Copyright © 2011-2022 走看看