積分圖像(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(:))]);
積分圖像是一種預計算技術,本質是空間換時間。得到積分圖像後,通過4次查表便可以在常量時間內計算出任意一個矩形區域的灰度之和。如圖4,爲了計算ABCD圍成的紅色矩形區域中的和,需要從它的積分圖像中取出四個值 、、、並進行如下計算:
圖4
值得注意的是,上述的A、B、C三個像素點並不在紅色區域內,如圖5所示,這在編程的時候需要格外注意!
圖5