pythonimage-processingtomography-reconstruction

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


My question is whether I can optimally determine the distance between the source and the center of rotation and the distance between the center of rotation and the detector array for a given image and projection geometry. By optimal I mean that the number of zero entries of the measurement vector is minimized.

In the following code snippet I used the Astra toolbox with which we simulate our 2D tomography.

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

In my example if I use np.linspace(0,np.pi,180) the number of zero-entries of fp are 1108, if I use np.linspace(0,np.pi/180,180) instead the number increases to 5133 which makes me believe that the values 1500.0 and 500.0 are not well chosen.


Solution

  • Generally speaking, those numbers are chosen due to experimental constrains and not algorithmic ones. In many settings these values are fixed, but lets ignore those, as you seem to have the flexibility.

    In an experimental scan, what do you want?

    If you are looking for high resolution you want the "magnification" DSD/DSO to be the highest, thus putting the detector far, and the object close to the source. This comes with problems though. A far detector requires higher scanning times for the same SNR (due to scatter and other phenomena that will make your X-rays not go straight). And not only that, the bigger the mag, the more likely you are to have huge parts of the object completely outside your detector range, as detectors are not that big (in mm).

    So the common scanning strategy to set these up is 1) put the detector as far as you can allow with your strict scanning time. 2) put the object as close to the source as you can, but always making sure its entire width fits in the detector.

    Often compromises can be done, particularly if you know what is the smallest feature you want to see (allow 3 or 4 pixels to properly see it).

    However, algorithmically speaking? its irrelevant. I can't speak for ASTRA, but likely not even the computational time will be affected, as pixels that have zeroes are because they are out of the field of view and therefore simply not computed, at all.


    Now, for your simple toy example, if you completely ignore all physics, there is a way:

    1.- use simple trigonometry to compute what ratios of distances you need to make sure all the object is in the detector.

    2.- create a fully white image and go changing the sizes iteratively until the first couple of pixels in the outside part of the detector become zero.