積分圖的每一點(x, y)的值是原圖中對應位置的左上角區域的所有值得和:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLwcjN1ETMxMTM3ITNwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
而且,積分圖可以隻周遊一次圖像即可有效的計算出來,因為積分圖每一點的(x, y)值是:
一旦積分圖計算完畢,對任意矩形區域的和的計算就可以在常數時間内完成。如下圖中,陰影矩形區域的值:
%建構積分圖的代碼
clear all;
close all;
clc;
img=double(imread('lena.jpg'));
[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
int_img = I;
%int_img就是輸出的積分圖
%利用積分圖求一張圖檔中某個矩形塊的和
stap = 4;%stap是矩形塊的大小4x4。
[M,N] = size(img);%image是整個圖檔
for i=1:stap:M
for j=1:stap:N
patch = img(i:i+stap-1,j:j+stap-1);從img中取一塊
if i+stap-1==stap && j+stap-1==stap
sum =int_img(i+stap-1,j+stap-1);
elseif i+stap-1==stap && j+stap-1~=stap %第一行
sum =(int_img(i+stap-1,j+stap-1) - int_img(i+stap-1,j-1));
elseif i+stap-1~=stap && j+stap-1==stap %第一列
sum =(int_img(i+stap-1,j+stap-1) - int_img(i-1,j+stap-1));
else
sum =(int_img(i+stap-1,j+stap-1) + int_img(i-1,j-1) - int_img(i-1,j+stap-1) - int_img(i+stap-1,j-1)); %其他
end
end
end