图像处理之积分图算法

简介: 图像处理之积分图算法

图像处理之积分图算法


一:积分图来源与发展


积分图像是Crow在1984年首次提出,是为了在多尺度透视投影中提高渲染速度。随后这种技术被应用到基于NCC的快速匹配、对象检测和SURF变换中、基于统计学的快速滤波器等方面。积分图像是一种在图像中快速计算矩形区域和的方法,这种算法主要优点是一旦积分图像首先被计算出来我们可以计算图像中任意大小矩形区域的和而且是在常量时间内。这样在图像模糊、边缘提取、对象检测的时候极大降低计算量、提高计算速度。第一个应用积分图像技术的应用是在Viola-Jones的对象检测框架中出现。


二:积分图像概念


在积分图像(Integral Image - ii)上任意位置(x, y)处的ii(x, y)表示该点左上角所有像素之和,表示如下:

20160930133226930.png


20160930133251758.png



从给定图像I从上到下、从左到右计算得到和的积分图像公式如下:


20160930133430636.png


其中(x<0 || y<0) 时ii(x,y)=0, i(x,y)=0


得到积分图像之后,图像中任意矩形区域和通过如下公式计算:

20160930133515618.png

20160930133542994.png




三:代码实现:


积分图像算法的Java代码实现如下:

package com.gloomyfish.ii.demo;
 
public class IntIntegralImage extends AbstractByteProcessor {
  // sum index tables
  private int[] sum;
  private int[] squaresum;
  // image
  private byte[] image;
  private int width;
  private int height;
 
  public byte[] getImage() {
    return image;
  }
 
  public void setImage(byte[] image) {
    this.image = image;
  }
  
  public int getBlockSum(int x, int y, int m, int n) {
    int swx = x + n/2;
    int swy = y + m/2;
    int nex = x-n/2-1;
    int ney = y-m/2-1;
    int sum1, sum2, sum3, sum4;
    if(swx >= width) {
      swx = width - 1;
    }
    if(swy >= height) {
      swy = height - 1;
    }
    if(nex < 0) {
      nex = 0;
    }
    if(ney < 0) {
      ney = 0;
    }
    sum1 = sum[ney*width+nex];
    sum4 = sum[swy*width+swx];
    sum2 = sum[swy*width+nex];
    sum3 = sum[ney*width+swx];
    return ((sum1 + sum4) - sum2 - sum3);
  }
  
  public int getBlockSquareSum(int x, int y, int m, int n) {    
    int swx = x + n/2;
    int swy = y + m/2;
    int nex = x-n/2-1;
    int ney = y-m/2-1;
    int sum1, sum2, sum3, sum4;
    if(swx >= width) {
      swx = width - 1;
    }
    if(swy >= height) {
      swy = height - 1;
    }
    if(nex < 0) {
      nex = 0;
    }
    if(ney < 0) {
      ney = 0;
    }
    sum1 = squaresum[ney*width+nex];
    sum4 = squaresum[swy*width+swx];
    sum2 = squaresum[swy*width+nex];
    sum3 = squaresum[ney*width+swx];
    return ((sum1 + sum4) - sum2 - sum3);
  }
 
  @Override
  public void process(int width, int height) {
    this.width = width;
    this.height = height;
    sum = new int[width*height];
    squaresum = new int[width*height];
    // rows
    int p1=0, p2=0, p3=0, p4;
    int offset = 0, uprow=0, leftcol=0;
    int s=0;
    for(int row=0; row<height; row++ ) {
      offset = row*width;
      uprow = row-1;
      for(int col=0; col<width; col++) {
        leftcol=col-1;
        p1=image[offset]&0xff;// p(x, y)
        p2=(leftcol<0) ? 0:sum[offset-1]; // p(x-1, y)
        p3=(uprow<0) ? 0:sum[offset-width]; // p(x, y-1);
        p4=(uprow<0||leftcol<0) ? 0:sum[offset-width-1]; // p(x-1, y-1);
        s = sum[offset]= p1+p2+p3-p4;
        squaresum[offset]=s*s;
        // System.out.print("\t[" + offset+"]=" + s);
        offset++;
      }
      // System.out.println();
    }
  }
  
  public static void main(String[] args) {
    byte[] data = new byte[]{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
    IntIntegralImage ii = new IntIntegralImage();
    ii.setImage(data);
    ii.process(7, 3);
    
    int sum = ii.getBlockSum(3, 2, 3, 3);
    System.out.println("sum = " + sum);
  }
}

后续应用相关博文会陆续出炉!

相关文章
|
3月前
|
算法 计算机视觉
图像处理之积分图应用四(基于局部均值的图像二值化算法)
图像处理之积分图应用四(基于局部均值的图像二值化算法)
516 0
|
3月前
|
监控 算法 图计算
图像处理之积分图应用三(基于NCC快速相似度匹配算法)
图像处理之积分图应用三(基于NCC快速相似度匹配算法)
62 0
|
3月前
|
文字识别 算法 计算机视觉
图像处理之Zhang Suen细化算法
图像处理之Zhang Suen细化算法
54 0
|
3月前
|
资源调度 算法 计算机视觉
图像处理之积分图应用二(快速边缘保留滤波算法)
图像处理之积分图应用二(快速边缘保留滤波算法)
26 0
|
3月前
|
算法 BI 计算机视觉
图像处理之积分图应用一(半径无关的快速模糊算法)
图像处理之积分图应用一(半径无关的快速模糊算法)
31 0
|
3月前
|
算法 计算机视觉
图像处理之基于泛红算法的二值图像内部区域填充
图像处理之基于泛红算法的二值图像内部区域填充
37 0
|
22天前
|
算法 BI Serverless
基于鱼群算法的散热片形状优化matlab仿真
本研究利用浴盆曲线模拟空隙外形,并通过鱼群算法(FSA)优化浴盆曲线参数,以获得最佳孔隙度值及对应的R值。FSA通过模拟鱼群的聚群、避障和觅食行为,实现高效全局搜索。具体步骤包括初始化鱼群、计算适应度值、更新位置及判断终止条件。最终确定散热片的最佳形状参数。仿真结果显示该方法能显著提高优化效率。相关代码使用MATLAB 2022a实现。
|
23天前
|
算法 数据可视化
基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
奇异谱分析(SSA)是一种基于奇异值分解(SVD)和轨迹矩阵的非线性、非参数时间序列分析方法,适用于提取趋势、周期性和噪声成分。本项目使用MATLAB 2022a版本实现从强干扰序列中提取趋势线,并通过可视化展示了原时间序列与提取的趋势分量。代码实现了滑动窗口下的奇异值分解和分组重构,适用于非线性和非平稳时间序列分析。此方法在气候变化、金融市场和生物医学信号处理等领域有广泛应用。
|
24天前
|
资源调度 算法
基于迭代扩展卡尔曼滤波算法的倒立摆控制系统matlab仿真
本课题研究基于迭代扩展卡尔曼滤波算法的倒立摆控制系统,并对比UKF、EKF、迭代UKF和迭代EKF的控制效果。倒立摆作为典型的非线性系统,适用于评估不同滤波方法的性能。UKF采用无迹变换逼近非线性函数,避免了EKF中的截断误差;EKF则通过泰勒级数展开近似非线性函数;迭代EKF和迭代UKF通过多次迭代提高状态估计精度。系统使用MATLAB 2022a进行仿真和分析,结果显示UKF和迭代UKF在非线性强的系统中表现更佳,但计算复杂度较高;EKF和迭代EKF则更适合维数较高或计算受限的场景。
|
25天前
|
算法
基于SIR模型的疫情发展趋势预测算法matlab仿真
该程序基于SIR模型预测疫情发展趋势,通过MATLAB 2022a版实现病例增长拟合分析,比较疫情防控力度。使用SIR微分方程模型拟合疫情发展过程,优化参数并求解微分方程组以预测易感者(S)、感染者(I)和移除者(R)的数量变化。![]该模型将总人群分为S、I、R三部分,通过解析或数值求解微分方程组预测疫情趋势。