我尝试分离图像的各个通道,然后使用递归函数进行计算。最后,我加入了三个渠道:
function [ii] = computeIntegralImage(image)
%function to compute integral from original image
iip=zeros(size(image,1)+1,size(image,2)+1);
jjp=zeros(size(image,1)+1,size(image,2)+1);
kkp=zeros(size(image,1)+1,size(image,2)+1);
for i=2:size(iip,1)
for j=2:size(iip,2)
iip(i,j)=image(i-1,j-1,1)+iip(i,j-1)+iip(i-1,j)-iip(i-1,j-1);
end
end
for i=2:size(jjp,1)
for j=2:size(jjp,2)
jjp(i,j)=image(i-1,j-1,2)+jjp(i,j-1)+jjp(i-1,j)-jjp(i-1,j-1);
end
end
for i=2:size(kkp,1)
for j=2:size(kkp,2)
kkp(i,j)=image(i-1,j-1,3)+kkp(i,j-1)+kkp(i-1,j)-kkp(i-1,j-1);
end
end
ii= cat(3,iip,jjp,kkp);
函数integralImage
的matlab输出是完全白色的:
我的输出是彩色图像:
答案 0 :(得分:1)
可以通过首先在一个轴上积分,然后在另一个轴上积分结果来轻松计算积分图像。这个一维积分是用cumsum
计算的:
out = cumsum(image,1);
out = cumsum(out,2);
请注意,如果image
是整数类型,则可能会导致溢出。您应该先将这样的数组转换为double
。
最后,要显示您需要使用的结果
imshow(out,[])
否则,您将看不到数据的全部范围,并且超过1的任何东西都会变成白色,就像在MATLAB的结果中看到的那样。
关于您的代码:
问题是溢出。将input
的值先转换为两倍。在MATLAB中,uint8(150)+150 == uint8(255)
。这样会导致行和列交替出现,就像您看到的那样:第一步,从部分和中减去一些大的值,导致一个小值;下一步,从一个部分减去一个小值,导致一个大值,等等。
起初,我对输出中的第一行和第一列保持为0感到困惑。但是后来我注意到输出比输入大一号,因此请使用第一列以避免特殊情况。 考虑从输出中裁剪第一行和第一列。
关于循环顺序:当内部循环在第一个维度上时,速度更快,因为这样可以按照存储顺序访问数据,因此可以更好地使用缓存。这不应该影响结果,而只是时间。