积分图像(integral image)是一种高速计算矩形区域之和的数据结构,常利用它对算法进行加速。积分图像中处的值是原始灰度图像的左上角与当前点所围成的矩形区域内全部像素点的灰度值之和,即:
当中 为原图像, 为积分图像。图1是积分图像的示意。
图1
积分图像是用来加速算法的。因此求取积分图像本身复杂度不能非常高。否则就失去了意义。为了高速的计算出积分图像。须要充分利用已经计算出的结果。避免反复计算。
计算公式例如以下:
下图是该公式的原理示意:
图2
以下给出计算积分图像的matlab程序:
Integral.m
function I=Integral(Img) Img=double(Img); [m,n]=size(Img); I=zeros(m,n); for i=1:m for j=1:n if i==1 && j==1 %积分图像左上角 I(i,j)=Img(i,j); elseif i==1 && j~=1 %积分图像第一行 I(i,j)=I(i,j-1)+Img(i,j); elseif i~=1 && j==1 %积分图像第一列 I(i,j)=I(i-1,j)+Img(i,j); else %积分图像其他像素 I(i,j)=Img(i,j)+I(i-1,j)+I(i,j-1)-I(i-1,j-1); end end end
main.m
close all; clear all; clc; Img=double(imread('lena.tif')); Int=integral(Img); figure; imshow([Img/max(Img(:)),Int/max(Int(:))]);
图3
积分图像是一种估计算技术,本质是空间换时间。得到积分图像后。通过4次查表便能够在常量时间内计算出随意一个矩形区域的灰度之和。如图4,为了计算ABCD围成的红色矩形区域中的和。须要从它的积分图像中取出四个值 、、、并进行例如以下计算:
图4
值得注意的是。上述的A、B、C三个像素点并不在红色区域内,如图5所看到的,这在编程的时候须要格外注意。
图5