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, [])
我有一组图片需要用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, [])