一个如何从原始图像计算出积分图像?

时间:2018-11-03 09:11:36

标签: image matlab image-processing

我尝试分离图像的各个通道,然后使用递归函数进行计算。最后,我加入了三个渠道:

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输出是完全白色的:

Matlab Output

我的输出是彩色图像:

My Output

1 个答案:

答案 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感到困惑。但是后来我注意到输出比输入大一号,因此请使用第一列以避免特殊情况。 考虑从输出中裁剪第一行和第一列。

关于循环顺序:当内部循环在第一个维度上时,速度更快,因为这样可以按照存储顺序访问数据,因此可以更好地使用缓存。这不应该影响结果,而只是时间。