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

时间:2015-02-22 04:53:27

标签: matlab image-processing

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

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

im是原始图片,ii_im是整体图片。

这里的问题是ii_im中的值流出0到255范围。 使用imshow(ii_im)时,我总会得到一张非常明亮的图像,我不确定是否是正确的结果。我在这里纠正吗?

1 个答案:

答案 0 :(得分:1)

你正在实现正确的积分图像计算,但我不明白为什么你想要将它可视化 - 特别是因为总和将超出任何正常的整数范围。这是预期的,因为当您移动到图像的右下方时,您正在执行由更大和更大的矩形邻域限定的强度的总和。你不可避免地会在右下方获得大数字。此外,在尝试显示此图像时,您显然会获得白色图像,因为大多数值将超过255,可视化为白色。

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

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

首先指定的方向无关紧要(2然后是1,或1然后2)。只要指定要操作的所有方向,每个有界区域内所有像素的总和应该相同。

回到你的问题展示,如果你真的,真的,真的......我的意思是真的想要,你可以通过这样做来标准化对比度:

imshow(ii_im, []);

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

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

enter image description here

enter image description here

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

另一个选项可能是对整数图像中的每个值应用log操作。类似的东西:

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

然而,这将使大多数像素具有相同的对比度,这可能没有用。这就是我cameraman.tif所得到的:

enter image description here


这个故事的寓意是你需要某种对比度规范化,这样你就可以在用于在屏幕上显示图像的数据类型的范围内,使整数图像中的所有值都适合{{ 1}}。