odlgroup / odl

Operator Discretization Library https://odlgroup.github.io/odl/
Mozilla Public License 2.0
361 stars 106 forks source link

How to represent the range of a tomographic projection? #156

Closed kohr-h closed 7 years ago

kohr-h commented 8 years ago

Current situation

The geometries differentiate between abstract "motion parameters" (name could be better, maybe "system parameters") and detector parameters.

Motion parameters are usually one or two rotation angles in simple geometries or a curve parameter describing positions on an acquisition curve, e.g. a helix. Physically they typically describe how the imaging system "moves" over time relative to the static object coordinate system. But they could also mean something completely different, i.e. describe the distribution of transducers in an ultrasound experiment, where no movement of an imaging system is involved. I found it hard to come up with a name short enough and general enough to be adequate.

Anyway, while the first set of parameters describes the imaging system as a whole, the second one describes the detector, and there are mappings from these parameters to the locations of detector points in space, given in the local coordinate system of the detector (i.e. for a fixed reference detector).

This corresponds to the splitting of the parameters into, e.g., angle and detector position. However, mainly for convenience and without particular reasoning, these parameter sets are lumped together, and the ASTRA backed projectors use a discretized function space on that "lump" as their range.

Concrete example:

>>> angle_range = odl.Interval(0, np.pi)
>>> det_params = odl.Interval(-0.5, 0.5)  # total width of 1 (meter?)
>>> lumped_params = angle_range.insert(det_params)
>>> lumped_params
Rectangle([0.0, -0.5], [3.1415926535897931, 0.5])

So the operator range will be a discretization of a function space based on this rectangle.

Alternative

Another viable way would be the following: given a list of angles, make the projector a ProductSpaceOperator with one operator part per angle (or group of angles). Something like that will be needed anyway if we want to implement Kaczmarz-type methods with split operators.

Follow-up issues

kohr-h commented 7 years ago

I think this is superseded by the way we think about Kaczmarz now, i.e. as something taking a list of operators rather than a single product space operator. Also the range representation seems to work well. Some specific cases like #152 and #671 still have to be sorted out, but we're getting there.

Closing.