MATLAB 中的扇形光束重建工件

Fan Beam reconstruction artifacts in MATLAB

我有一组图片需要用MATLAB进行扇形光束投影和重建。但是对于这些照片,我有奇怪的伪影。

根据 ifanbeam() 函数的文档,我编写了以下代码:

ph = phantom(100);
d = 100;
fan_proj = fanbeam(ph,d);
fan_reproj = ifanbeam(fan_proj,d);
imshow(fan_reproj)

而且效果很好:

但后来我尝试显式地将幻影图像保存在驱动器上(而不是从 MATLAB 本身加载它),从驱动器加载它,并执行相同的操作。

ph = phantom(100);
imwrite(ph, 'phantom.png');
clear;

ph = imread('phantom.png');
d = 100;
fan_proj = fanbeam(ph,d);
fan_reproj = ifanbeam(fan_proj,d);
imshow(fan_reproj)

结果出现了奇怪的伪影:

为什么会这样?图像到底发生了什么变化,所以这个函数的结果也发生了如此巨大的变化?

问题是 imshow(默认情况下)期望输入数据的值介于 0 和 1 之间。当您第一次构造幻影时,这是真的。

ph = phantom(100);
min(ph)

    0

max(ph)

    1

但是当您从文件中加载它时,它将具有 0 到 255 之间的值。这是因为它是作为无符号 8 位整数保存和加载回来的:

ph = imread('phtnom.png');

class(ph)

    uint8

min(ph)

    0

max(ph)

    255

当您使用 imshow 和默认颜色缩放时,它将 仍然 为 [0,1],导致您看到的极端对比度。

您可以使用[]作为second input to imshow以确保显示图像的完整动态范围。

imshow(fan_reproj, [])