ImFusion SDK 4.3

Tomographic reconstruction techniques to compute the 3D CT images from a set of X-ray projections in different acquisition geometries. More...

+ Collaboration diagram for CT Reconstruction:

Detailed Description

Tomographic reconstruction techniques to compute the 3D CT images from a set of X-ray projections in different acquisition geometries.

CT reconstruction using different reconstruction techniques (source: VerSe dataset)

This page will provide a brief overview of how to use ReconstructionAlgorithm class to compute an X-ray tomographic image from a given ConeBeamData instance. A ConeBeamData object refers to a set of X-ray projections acquired with a point source. Additionally, the ConeBeamData class also attaches a ConeBeamGeometry instance to describe the acquisition geometry of a cone-beam CT system. In the following tutorial, the ConeBeamGeometry is assumed to have been calibrated.

CT reconstruction can be computed using different mathematical approaches. The current ReconstructionAlgorithm class supports to various formulations of the reconstruction problem through the problem mode and uses different techniques to solve the corresponding problem by setting the solver mode. To begin, one need to first create a ReconstructionAlgorithm instance which takes a ConeBeamData as input.

#include <ImFusion/CT/ReconstructionAlgorithm.h>
ReconstructionAlgorithm reconAlg(*cbData);
std::unique_ptr< SharedImageSet > makeConeBeamData()
Generates a SharedImageSet that fulfils the ConeBeamData concept.

Setup reconstruction algorithm

Volume descriptor for the reconstruction

Once initialized, the ReconstructionAlgorithm creates a SharedImageSet instance to store the reconstructed data. Now, we will specify the ImageDescriptorWorld for the reconstruction volume.

reconAlg.setVolumeDescriptor(ImageDescriptorWorld(ImageDescriptor(PixelType::Float, vec3i(128, 128, 128)), mat4::Identity()));

Reconstruction problem and solver

The problem and solver mode must be set up in such a way that they are comparable. Currently supported reconstruction problems include "LeastSquaresProblem", "StatisticallyWeightedLeastSquaresProblem", "LeastSquaresIsotropicTV", "DummyDevelopmentProblem", "none". And supported solvers include "FDK", "MLEM", "CG", "SART", "SQS", "none". Not all solvers are comparible to every problem, set the problem first, then the solver. If the problem and the solver are mismatched, the solver will be reset to a compatible solver on changes of the problem, see ReconstructionAlgorithm.

reconAlg.p_problemMode = "LeastSquaresProblem";
reconAlg.p_solverMode = "FDK";

Miscellaneous parameters for iterative solver and optimization problem

Depending on the problem and solver, additional configurations can be specified through the corresponding algorithm parameters. There are several configurations that are only available for specific solver. One can set them through the corresponding solver instance. For example, we can set the p_subsetSize and p_additionalWeights paramters for the FDK solver as follows. Different additional weights can be used: "None", "Parker", "Wang", "ParkerAndWang". Enable/disable FDK p_normalize parameter that will normlize the final reconstruction with the number of rays passing through each voxel.

// FDK solver
dynamic_cast<FDK*>(reconAlg.value()->solver())->p_subsetSize = 100;
dynamic_cast<FDK*>(reconAlg.value()->solver())->p_normalize = true;
dynamic_cast<FDK*>(reconAlg.value()->solver())->p_additionalWeights = FDK::AdditionalWeights::Parker;

The iterative solvers require p_maxIterations parameter to be set along with the other parameters:

// Iterative solvers (CG)
dynamic_cast<IterativeSolver*>(reconAlg.value()->solver())->p_maxIterations = 10;
dynamic_cast<IterativeSolver*>(reconAlg.value()->solver())->p_nesterov = true;
// Iterative solvers (MLEM, SART, SQS)
dynamic_cast<IterativeOSSolcer*>(reconAlg.value()->solver())->p_subsetSize = 100;
dynamic_cast<IterativeOSSolcer*>(reconAlg.value()->solver())->p_maxIterations = 10;
dynamic_cast<IterativeOSSolcer*>(reconAlg.value()->solver())->p_nesterov = true;

Compute CT reconstruction

We can now run the ReconstructionAlgorithm to compute the CT image from the input data with specified volume descriptor, and take the output CT volume as a SharedImageSet instance.

reconAlg.compute();
SharedImageSet* ctVolume = reconAlg.reconstruction();

Topics

 CT Event Handler
 
 CT Solver
 

Classes

class  CBCTPostProcessing
 CBCTPostProcessing performs a cone cropping of a CT volume. More...
 
class  ConeBeamReconLoaderExtra
 Loading and pre-processing of data from various CBCT devices. More...
 
class  GlFourierFilter1D
 OpenGL-based 1D ramp filter for FDK reconstruction. More...
 
class  ProjectionSets
 Computation of projection subsets for iterative reconstruction. More...
 
class  CBCTProjector
 Abstract base class for Cone-Beam Computed Tomography (CBCT) projectors. More...
 
class  GlCBCTProjector
 OpenGL-based cone-beam CT projector implementation. More...
 
class  ReconstructionAlgorithm
 Algorithm for tomographic reconstruction. More...
 
class  AlgorithmReconstructionDecoratorInterface
 Base class interface for AlgorithmReconstructionDecorator. More...
 
class  AlgorithmReconstructionDecorator< Base >
 Template decorator for algorithms requiring reconstruction capabilities. More...
 
Search Tab / S to search, Esc to close