Source code for astra.ASTRAProjector
#-----------------------------------------------------------------------
#Copyright 2013 Centrum Wiskunde & Informatica, Amsterdam
#
#Author: Daniel M. Pelt
#Contact: D.M.Pelt@cwi.nl
#Website: http://dmpelt.github.io/pyastratoolbox/
#
#
#This file is part of the Python interface to the
#All Scale Tomographic Reconstruction Antwerp Toolbox ("ASTRA Toolbox").
#
#The Python interface to the ASTRA Toolbox is free software: you can redistribute it and/or modify
#it under the terms of the GNU General Public License as published by
#the Free Software Foundation, either version 3 of the License, or
#(at your option) any later version.
#
#The Python interface to the ASTRA Toolbox is distributed in the hope that it will be useful,
#but WITHOUT ANY WARRANTY; without even the implied warranty of
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
#GNU General Public License for more details.
#
#You should have received a copy of the GNU General Public License
#along with the Python interface to the ASTRA Toolbox. If not, see <http://www.gnu.org/licenses/>.
#
#-----------------------------------------------------------------------
import creators as ac
import math
import data2d
[docs]class ASTRAProjector2DTranspose():
"""Implements the ``proj.T`` functionality.
Do not use directly, since it can be accessed as member ``.T`` of
an :class:`ASTRAProjector2D` object.
"""
def __init__(self, parentProj):
self.parentProj = parentProj
def __mul__(self, data):
return self.parentProj.backProject(data)
[docs]class ASTRAProjector2D(object):
"""Helps with various common ASTRA Toolbox 2D operations.
This class can perform several often used toolbox operations, such as:
* Forward projecting
* Back projecting
* Reconstructing
Note that this class has a some computational overhead, because it
copies a lot of data. If you use many repeated operations, directly
using the PyAstraToolbox methods directly is faster.
You can use this class as an abstracted weight matrix :math:`W`: multiplying an instance
``proj`` of this class by an image results in a forward projection of the image, and multiplying
``proj.T`` by a sinogram results in a backprojection of the sinogram::
proj = ASTRAProjector2D(...)
fp = proj*image
bp = proj.T*sinogram
:param proj_geom: The projection geometry.
:type proj_geom: :class:`dict`
:param vol_geom: The volume geometry.
:type vol_geom: :class:`dict`
:param proj_type: Projector type, such as ``'line'``, ``'linear'``, ...
:type proj_type: :class:`string`
:param useCUDA: If ``True``, use CUDA for calculations, when possible.
:type useCUDA: :class:`bool`
"""
def __init__(self, proj_geom, vol_geom, proj_type, useCUDA=False):
self.vol_geom = vol_geom
self.recSize = vol_geom['GridColCount']
self.angles = proj_geom['ProjectionAngles']
self.nDet = proj_geom['DetectorCount']
nexpow = int(pow(2, math.ceil(math.log(2 * self.nDet, 2))))
self.filterSize = nexpow / 2 + 1
self.nProj = self.angles.shape[0]
self.proj_geom = proj_geom
self.proj_id = ac.create_projector(proj_type, proj_geom, vol_geom)
self.useCUDA = useCUDA
self.T = ASTRAProjector2DTranspose(self)
[docs] def backProject(self, data):
"""Backproject a sinogram.
:param data: The sinogram data or ID.
:type data: :class:`numpy.ndarray` or :class:`int`
:returns: :class:`numpy.ndarray` -- The backprojection.
"""
vol_id, vol = ac.create_backprojection(
data, self.proj_id, self.useCUDA, True)
data2d.delete(vol_id)
return vol
[docs] def forwardProject(self, data):
"""Forward project an image.
:param data: The image data or ID.
:type data: :class:`numpy.ndarray` or :class:`int`
:returns: :class:`numpy.ndarray` -- The forward projection.
"""
sin_id, sino = ac.create_sino(data, self.proj_id, self.useCUDA, True)
data2d.delete(sin_id)
return sino
[docs] def reconstruct(self, data, method, **kwargs):
"""Reconstruct an image from a sinogram.
:param data: The sinogram data or ID.
:type data: :class:`numpy.ndarray` or :class:`int`
:param method: Name of the reconstruction algorithm.
:type method: :class:`string`
:param kwargs: Additional named parameters to pass to :func:`astra.creators.create_reconstruction`.
:returns: :class:`numpy.ndarray` -- The reconstruction.
Example of a SIRT reconstruction using CUDA::
proj = ASTRAProjector2D(...)
rec = proj.reconstruct(sinogram,'SIRT_CUDA',iterations=1000)
"""
kwargs['returnData'] = True
rec_id, rec = ac.create_reconstruction(
method, self.proj_id, data, **kwargs)
data2d.delete(rec_id)
return rec
def __mul__(self, data):
return self.forwardProject(data)