Radon 变换:优化 source/detector 和旋转中心之间的距离

Radon Transform: optimize distance between source/detector and center of rotation

我的问题是对于给定的图像和投影几何,我是否可以最佳地确定源与旋转中心之间的距离以及旋转中心与探测器阵列之间的距离。 我所说的最佳是指测量向量的零条目数最小化。

在下面的代码片段中,我使用了 Astra 工具箱来模拟 2D 断层扫描。

from skimage.io import imread
from astra import creators, optomo
import numpy as np

# load some 400x400 pixel image 
image = imread("/path/to/image.png, as_gray=True)"

# create geometries and projector
# proj_geom = astra_create_proj_geom('fanflat', det_width, det_count, angles, source_origin, origin_det)
proj_geom = creators.create_proj_geom('fanflat', 1.0, 400, np.linspace(0,np.pi,180), 1500.0, 500.0);
vol_geom = creators.create_vol_geom(400,400)
proj_id = creators.create_projector('line_fanflat', proj_geom, vol_geom)

# create forward projection
# fp is our measurement vector
W = optomo.OpTomo(proj_id)
fp = W*image

在我的示例中,如果我使用 np.linspace(0,np.pi,180)fp 的零条目数是 1108,如果我使用 np.linspace(0,np.pi/180,180),则该数字增加到 5133 这让我相信 1500.0500.0 的值选择不当。

一般来说,这些数字是由于实验限制而不是算法限制而选择的。在许多设置中,这些值是固定的,但让我们忽略它们,因为您似乎具有灵活性。

在实验扫描中,你想要什么?

如果您正在寻找高分辨率,您希望 "magnification" DSD/DSO 是最高的,从而使检测器远离,而物体靠近源。但是,这会带来问题。对于相同的 SNR,远检测器需要更长的扫描时间(由于散射和其他现象会使您的 X 射线无法直行)。不仅如此,mag 越大,物体的大部分完全超出探测器范围的可能性就越大,因为探测器没有那么大(以毫米为单位)。

所以设置这些的常见扫描策略是 1) 在严格的扫描时间允许的范围内,将检测器放在尽可能远的地方。 2) 将物体尽可能靠近光源,但始终确保其整个宽度适合检测器。

通常可以做出妥协,特别是如果您知道您想要看到的最小特征是什么(允许 3 或 4 个像素才能正确看到它)。

但是,从算法上来说?这无关紧要。我不能代表 ASTRA,但可能甚至计算时间都不会受到影响,因为具有零的像素是因为它们不在视野范围内,因此根本不会被计算。


现在,对于您的简单玩具示例,如果您完全忽略所有物理,则有一种方法:

1.- 使用简单的三角函数来计算您需要的距离比,以确保所有物体都在检测器中。

2.- 创建一个全白图像并迭代更改大小,直到检测器外部的前几个像素变为零。