我尝试通过以下方式在MATLAB中实现积分图像:
im = imread('image.jpg');
ii_im = cumsum(cumsum(double(im)')');
im
是原始图片,ii_im
是整体图片。
这里的问题是ii_im
中的值流出0到255范围。
使用imshow(ii_im)
时,我总会得到一张非常明亮的图像,我不确定是否是正确的结果。我在这里纠正吗?
答案 0 :(得分:1)
你正在实现正确的积分图像计算,但我不明白为什么你想要将它可视化 - 特别是因为总和将超出任何正常的整数范围。这是预期的,因为当您移动到图像的右下方时,您正在执行由更大和更大的矩形邻域限定的强度的总和。你不可避免地会在右下方获得大数字。此外,在尝试显示此图像时,您显然会获得白色图像,因为大多数值将超过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
所得到的:
这个故事的寓意是你需要某种对比度规范化,这样你就可以在用于在屏幕上显示图像的数据类型的范围内,使整数图像中的所有值都适合{{ 1}}。