在MATLAB中实现积分图像的问题

Problems in implementing the integral image in MATLAB

我尝试通过以下方式在 MATLAB 中实现积分图像:

im = imread('image.jpg');  
ii_im = cumsum(cumsum(double(im)')');

im为原图,ii_im为积分图

这里的问题是 ii_im 中的值超出了 0 到 255 的范围。 使用 imshow(ii_im) 时,我总是得到非常明亮的图像,但我不确定结果是否正确。我说得对吗?

您正在正确执行积分图像计算,但我不明白您为什么要将其可视化 - 特别是因为总和将超出任何正常整数范围。这是预料之中的,因为当您移动到图像的右下角时,您正在执行由越来越大的矩形邻域界定的强度求和。您不可避免地会在右下角看到大量数字。此外,当您尝试显示此图像时,您显然会得到一个白色图像,因为大多数值将超过 255,即可视化为白色。

如果我可以添加一些东西,我有一个小的优化是摆脱转置并使用 cumsum 指定您想要处理的维度。具体可以这样做:

ii_im = cumsum(cumsum(double(im), 1), 2);

您先指定哪个方向(2 然后 1,或 1 然后 2)并不重要。每个有界区域内所有像素的总和,只要指定所有方向进行操作,应该是相同的。

回到你的显示问题,如果你真的,真的,真的......我的意思是真的想要,你可以通过以下方式标准化对比度:

imshow(ii_im, []);

但是,您应该期待的是渐变图像,它从顶部开始变暗,然后在到达图像的右下角时变亮。请记住,积分图像中的每个点都会计算图像左上角到该点的像素强度的总和,从而形成一个强度矩形,您需要对其进行求和。因此,当我们进一步向积分图像的下方和右侧移动时,总和应该增加。

对于cameraman.tif图像,这是原始图像,以及使用上述命令可视化的完整图像:

无论哪种方式,您绝对没有理由想要将其可视化。您可以将其直接用于任何需要它的应用程序(自适应阈值、Viola-Jones 检测器等)

另一个选项可能是对积分图像中的每个值应用 log 操作。类似于:

imshow(log(1 + ii_im), []);

但是,这会使大部分像素具有相同的对比度,这可能没有用。这就是我用 cameraman.tif:

得到的


这个故事的寓意是您需要某种对比度归一化,以便您可以将积分图像中的所有值都放在用于在屏幕上显示图像的数据类型的范围内imshow.