最近在参考OpenCV自己实现Haar特征,对积分图的计算稍微整理了一下,累加积分和平方积分就不说了,主要分析一下斜积分。
这是OpenCV的实现方式,一下子没整明白范围,所以自己画了个图比划了一下。
从上图看去,要计算点(X,Y)上面的面积,需要遍历上面所有的点,
但是对区域中的点进行遍历时,并不是每行都是从行初开始,行末结束的。由于斜积分都是计算的45°,所以可以求出它的每行的首尾位置。
没有以C语言实现,仅用MATLAB写出了其中的逻辑。
%斜积分
aa=imread('aaa.png');
aa=double(rgb2gray(aa));
[imagerow,imagecol]=size(aa);
I=zeros(20);
for Y=1:imagerow
for X=1:imagecol
for j=1:Y
%确定斜积分具体区域
if Y>=X && Y-j>=X
tbegin=1;
elseif Y>=X && Y-j<X
tbegin=j-Y+1;
elseif Y<X
tbegin=X-(Y-j)+1;
end
if X+Y<=imagecol
tend=imagecol-X-Y-j;
elseif X+Y>imagecol && X+Y-j>=imagecol
tend=imagecol;
elseif X+Y>imagecol && X+Y-j<imagecol
tend=imagecol-j;
end
for i=tbegin:tend
I(X,Y)=I(X,Y)+aa(i,j);
end
end
end
end
逻辑大概是这样,只是索引有些错误,因为MATLAB的索引是从1开始的。
感觉上面的公式意思也是这个意思,只是这个比较直白了