pytomography.algorithms.statistical_iterative#

This module contains classes that implement statistical iterative reconstruction algorithms.

Module Contents#

Classes#

StatisticalIterative

Parent class for all statistical iterative algorithms. All child classes must implement the __call__ method to perform reconstruction.

OSEMOSL

Implementation of the ordered subset expectation algorithm using the one-step-late method to include prior information: \(\hat{f}^{n,m+1} = \left[\frac{1}{H_m^T 1 + \beta \frac{\partial V}{\partial \hat{f}}|_{\hat{f}=\hat{f}^{n,m}}} H_m^T \left(\frac{g_m}{H_m\hat{f}^{n,m}+s}\right)\right] \hat{f}^{n,m}\).

BSREM

Implementation of the block-sequential-regularized (BSREM) reconstruction algorithm: \(\hat{f}^{n,m+1} = \hat{f}^{n,m} + \alpha_n D \left[H_m^T \left(\frac{g_m}{H_m \hat{f}^{n,m} + s} -1 \right) - \beta \nabla_{f^{n,m}} V \right]\). The implementation of this algorithm corresponds to Modified BSREM-II with \(U=\infty\), \(t=0\), and \(\epsilon=0\) (see https://ieeexplore.ieee.org/document/1207396). There is one difference in this implementation: rather than using FBP to get an initial estimate (as is done in the paper), a single iteration of OSEM is used; this initialization is required here due to the requirement for global scaling (see discussion on page 620 of paper).

OSEM

Implementation of the ordered subset expectation maximum algorithm \(\hat{f}^{n,m+1} = \left[\frac{1}{H_m^T 1} H_m^T \left(\frac{g_m}{H_m\hat{f}^{n,m}+s}\right)\right] \hat{f}^{n,m}\).

KEM

Implementation of the KEM reconstruction algorithm given by \(\hat{\alpha}^{n,m+1} = \left[\frac{1}{K^T H_m^T 1} K^T H_m^T \left(\frac{g_m}{H_m K \hat{\alpha}^{n,m}+s}\right)\right] \hat{\alpha}^{n,m}\) and where the final predicted object is \(\hat{f}^{n,m} = K \hat{\alpha}^{n,m}\).

class pytomography.algorithms.statistical_iterative.StatisticalIterative(projections, system_matrix, object_initial=None, scatter=0, prior=None, precompute_normalization_factors=True)[source]#

Parent class for all statistical iterative algorithms. All child classes must implement the __call__ method to perform reconstruction.

Parameters:
  • projections (torch.Tensor) – photopeak window projection data \(g\) to be reconstructed

  • system_matrix (SystemMatrix) – system matrix that models the imaging system. In particular, corresponds to \(H\) in \(g=Hf\).

  • object_initial (torch.tensor[batch_size, Lx, Ly, Lz]) – the initial object guess \(f^{0,0}\). If None, then initial guess consists of all 1s. Defaults to None.

  • scatter (torch.Tensor) – estimate of scatter contribution \(s\). Defaults to 0.

  • prior (Prior, optional) – the Bayesian prior; used to compute \(\beta \frac{\partial V}{\partial f}\). If None, then this term is 0. Defaults to None.

  • precompute_normalization_factors (bool) –

get_subset_splits(n_subsets)[source]#

Returns a list of subsets (where each subset contains indicies corresponding to different angles). For example, if the projections consisted of 6 total angles, then get_subsets_splits(2) would return [[0,2,4],[1,3,5]].

Parameters:

n_subsets (int) – number of subsets used in OSEM

Returns:

list of index arrays for each subset

Return type:

list

abstract __call__(n_iters, n_subsets, callback=None)[source]#

Abstract method for performing reconstruction: must be implemented by subclasses.

Parameters:
  • n_iters (int) – Number of iterations

  • n_subsets (int) – Number of subsets

  • callbacks (Callback, optional) – Callbacks to be evaluated after each subiteration. Defaults to None.

  • callback (pytomography.callbacks.Callback | None) –

Return type:

None

class pytomography.algorithms.statistical_iterative.OSEMOSL(projections, system_matrix, object_initial=None, scatter=0, prior=None, precompute_normalization_factors=True)[source]#

Bases: StatisticalIterative

Implementation of the ordered subset expectation algorithm using the one-step-late method to include prior information: \(\hat{f}^{n,m+1} = \left[\frac{1}{H_m^T 1 + \beta \frac{\partial V}{\partial \hat{f}}|_{\hat{f}=\hat{f}^{n,m}}} H_m^T \left(\frac{g_m}{H_m\hat{f}^{n,m}+s}\right)\right] \hat{f}^{n,m}\).

Parameters:
  • projections (torch.Tensor) – photopeak window projection data \(g\) to be reconstructed

  • system_matrix (SystemMatrix) – system matrix that models the imaging system. In particular, corresponds to \(H\) in \(g=Hf\).

  • object_initial (torch.tensor[batch_size, Lx, Ly, Lz]) – the initial object guess \(f^{0,0}\). If None, then initial guess consists of all 1s. Defaults to None.

  • scatter (torch.Tensor) – estimate of scatter contribution \(s\). Defaults to 0.

  • prior (Prior, optional) – the Bayesian prior; used to compute \(\beta \frac{\partial V}{\partial f}\). If None, then this term is 0. Defaults to None.

  • precompute_normalization_factors (bool) –

_set_recon_name(n_iters, n_subsets)[source]#

Set the unique identifier for the type of reconstruction performed. Useful when saving reconstructions to DICOM files

Parameters:
  • n_iters (int) – Number of iterations

  • n_subsets (int) – Number of subsets

__call__(n_iters, n_subsets, callback=None)[source]#

Performs the reconstruction using n_iters iterations and n_subsets subsets.

Parameters:
  • n_iters (int) – Number of iterations

  • n_subsets (int) – Number of subsets

  • callback (Callback, optional) – Callback function to be evaluated after each subiteration. Defaults to None.

Returns:

reconstructed object

Return type:

torch.tensor[batch_size, Lx, Ly, Lz]

class pytomography.algorithms.statistical_iterative.BSREM(projections, system_matrix, object_initial=None, scatter=0, prior=None, relaxation_function=lambda x: ..., scaling_matrix_type='subind_norm')[source]#

Bases: StatisticalIterative

Implementation of the block-sequential-regularized (BSREM) reconstruction algorithm: \(\hat{f}^{n,m+1} = \hat{f}^{n,m} + \alpha_n D \left[H_m^T \left(\frac{g_m}{H_m \hat{f}^{n,m} + s} -1 \right) - \beta \nabla_{f^{n,m}} V \right]\). The implementation of this algorithm corresponds to Modified BSREM-II with \(U=\infty\), \(t=0\), and \(\epsilon=0\) (see https://ieeexplore.ieee.org/document/1207396). There is one difference in this implementation: rather than using FBP to get an initial estimate (as is done in the paper), a single iteration of OSEM is used; this initialization is required here due to the requirement for global scaling (see discussion on page 620 of paper).

Parameters:
  • projections (torch.Tensor) – projection data \(g\) to be reconstructed.

  • system_matrix (SystemMatrix) – System matrix \(H\) used in \(g=Hf\).

  • object_initial (torch.tensor[batch_size, Lx, Ly, Lz]) – represents the initial object guess \(f^{0,0}\) for the algorithm in object space

  • scatter (torch.Tensor) – estimate of scatter contribution \(s\).

  • prior (Prior, optional) – the Bayesian prior; computes \(\beta \frac{\partial V}{\partial f}\). If None, then this term is 0. Defaults to None.

  • relaxation_function (Callable, optional) – Sequence \(\alpha_n\) used for relaxation. Defaults to \(\alpha_n=1/(n+1)\).

  • scaling_matrix_type (str, optional) – The form of the scaling matrix \(D\) used. If subind_norm (sub-iteration independent + normalized), then \(D=\left(S_m/M \cdot H^T 1 \right)^{-1}\). If subdep_norm (sub-iteration dependent + normalized) then \(D = \left(H_m^T 1\right)^{-1}\). See section III.D in the paper above for a discussion on this.

_set_recon_name(n_iters, n_subsets)[source]#

Set the unique identifier for the type of reconstruction performed. Useful for saving to DICOM files

Parameters:
  • n_iters (int) – Number of iterations

  • n_subsets (int) – Number of subsets

_scale_prior_gradient(gradient)[source]#

Used to scale gradient to avoid divisional errors in null regions when using CutOffTransform

Parameters:

gradient (torch.tensor) – Gradient returned by prior function

Returns:

New gradient tensor where values are set to 0 outside the cutoff region.

Return type:

torch.tensor

__call__(n_iters, n_subsets, callback=None)[source]#

Performs the reconstruction using n_iters iterations and n_subsets subsets.

Parameters:
  • n_iters (int) – Number of iterations

  • n_subsets (int) – Number of subsets

  • callback (Callback, optional) – Callback function to be called after each subiteration. Defaults to None.

Returns:

reconstructed object

Return type:

torch.tensor[batch_size, Lx, Ly, Lz]

class pytomography.algorithms.statistical_iterative.OSEM(projections, system_matrix, object_initial=None, scatter=0, precompute_normalization_factor=True)[source]#

Bases: OSEMOSL

Implementation of the ordered subset expectation maximum algorithm \(\hat{f}^{n,m+1} = \left[\frac{1}{H_m^T 1} H_m^T \left(\frac{g_m}{H_m\hat{f}^{n,m}+s}\right)\right] \hat{f}^{n,m}\).

Parameters:
  • projections (torch.Tensor) – photopeak window projection data \(g\) to be reconstructed

  • system_matrix (SystemMatrix) – system matrix that models the imaging system. In particular, corresponds to \(H\) in \(g=Hf\).

  • object_initial (torch.tensor[batch_size, Lx, Ly, Lz]) – the initial object guess \(f^{0,0}\). If None, then initial guess consists of all 1s. Defaults to None.

  • scatter (torch.Tensor) – estimate of scatter contribution \(s\). Defaults to 0.

  • precompute_normalization_factors (bool) –

  • precompute_normalization_factor (bool) –

class pytomography.algorithms.statistical_iterative.KEM(projections, system_matrix, kem_transform, object_initial=None, scatter=0)[source]#

Bases: OSEM

Implementation of the KEM reconstruction algorithm given by \(\hat{\alpha}^{n,m+1} = \left[\frac{1}{K^T H_m^T 1} K^T H_m^T \left(\frac{g_m}{H_m K \hat{\alpha}^{n,m}+s}\right)\right] \hat{\alpha}^{n,m}\) and where the final predicted object is \(\hat{f}^{n,m} = K \hat{\alpha}^{n,m}\).

Parameters:
  • projections (torch.Tensor) – projection data \(g\) to be reconstructed

  • system_matrix (SystemMatrix) – System matrix \(H\) used in \(g=Hf\).

  • kem_transform (KEMTransform) – The transform corresponding to the matrix \(K\).

  • object_initial (torch.tensor[batch_size, Lx, Ly, Lz]) – represents the initial object guess \(f^{0,0}\) for the algorithm in object space

  • scatter (torch.Tensor) – estimate of scatter contribution \(s\).

__call__(n_iters, n_subsets, callback=None)[source]#

Performs the reconstruction using n_iters iterations and n_subsets subsets.

Parameters:
  • n_iters (int) – Number of iterations

  • n_subsets (int) – Number of subsets

  • callback (Callback, optional) – Callback function to be called after each subiteration. Defaults to None.

Returns:

reconstructed object

Return type:

torch.tensor[batch_size, Lx, Ly, Lz]