天天看點

matlab積分圖求一張圖檔中任意一個矩形塊的和

積分圖的每一點(x, y)的值是原圖中對應位置的左上角區域的所有值得和:

matlab積分圖求一張圖檔中任意一個矩形塊的和

而且,積分圖可以隻周遊一次圖像即可有效的計算出來,因為積分圖每一點的(x, y)值是:

matlab積分圖求一張圖檔中任意一個矩形塊的和

一旦積分圖計算完畢,對任意矩形區域的和的計算就可以在常數時間内完成。如下圖中,陰影矩形區域的值:

matlab積分圖求一張圖檔中任意一個矩形塊的和
matlab積分圖求一張圖檔中任意一個矩形塊的和
%建構積分圖的代碼
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		           
           

繼續閱讀