From ba0895b5299512e5028429e9e0111ab9944899cc Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Tue, 26 Apr 2016 16:45:33 +0200 Subject: Add SIRT plugin --- python/astra/__init__.py | 1 + python/astra/plugins/__init__.py | 28 +++++++++++++ python/astra/plugins/sirt.py | 90 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 119 insertions(+) create mode 100644 python/astra/plugins/__init__.py create mode 100644 python/astra/plugins/sirt.py (limited to 'python/astra') diff --git a/python/astra/__init__.py b/python/astra/__init__.py index 515d9a2..f4f5fe8 100644 --- a/python/astra/__init__.py +++ b/python/astra/__init__.py @@ -35,6 +35,7 @@ from . import projector from . import projector3d from . import matrix from . import plugin +from . import plugins from . import log from .optomo import OpTomo diff --git a/python/astra/plugins/__init__.py b/python/astra/plugins/__init__.py new file mode 100644 index 0000000..a24b04d --- /dev/null +++ b/python/astra/plugins/__init__.py @@ -0,0 +1,28 @@ +# ----------------------------------------------------------------------- +# Copyright: 2010-2016, iMinds-Vision Lab, University of Antwerp +# 2013-2016, CWI, Amsterdam +# +# Contact: astra@uantwerpen.be +# Website: http://sf.net/projects/astra-toolbox +# +# This file is part of the ASTRA Toolbox. +# +# +# 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 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 ASTRA Toolbox. If not, see . +# +# ----------------------------------------------------------------------- + + +from .sirt import SIRTPlugin + diff --git a/python/astra/plugins/sirt.py b/python/astra/plugins/sirt.py new file mode 100644 index 0000000..a0f1230 --- /dev/null +++ b/python/astra/plugins/sirt.py @@ -0,0 +1,90 @@ +# ----------------------------------------------------------------------- +# Copyright: 2010-2016, iMinds-Vision Lab, University of Antwerp +# 2013-2016, CWI, Amsterdam +# +# Contact: astra@uantwerpen.be +# Website: http://sf.net/projects/astra-toolbox +# +# This file is part of the ASTRA Toolbox. +# +# +# 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 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 ASTRA Toolbox. If not, see . +# +# ----------------------------------------------------------------------- + + +import astra +import numpy as np +import six + +class SIRTPlugin(astra.plugin.base): + """SIRT. + + Options: + + 'Relaxation': relaxation factor (optional) + 'MinConstraint': constrain values to at least this (optional) + 'MaxConstraint': constrain values to at most this (optional) + """ + + astra_name = "SIRT-PLUGIN" + + def initialize(self,cfg, Relaxation = 1, MinConstraint = None, MaxConstraint = None): + self.W = astra.OpTomo(cfg['ProjectorId']) + self.vid = cfg['ReconstructionDataId'] + self.sid = cfg['ProjectionDataId'] + self.min_constraint = MinConstraint + self.max_constraint = MaxConstraint + + try: + v = astra.data2d.get_shared(self.vid) + s = astra.data2d.get_shared(self.sid) + self.data_mod = astra.data2d + except Exception: + v = astra.data3d.get_shared(self.vid) + s = astra.data3d.get_shared(self.sid) + self.data_mod = astra.data3d + + self.R = self.W * np.ones(v.shape,dtype=np.float32).ravel(); + self.R[self.R < 0.000001] = np.Inf + self.R = 1 / self.R + self.R = self.R.reshape(s.shape) + + self.mrC = self.W.T * np.ones(s.shape,dtype=np.float32).ravel(); + self.mrC[self.mrC < 0.000001] = np.Inf + self.mrC = -Relaxation / self.mrC + self.mrC = self.mrC.reshape(v.shape) + + + def run(self, its): + v = self.data_mod.get_shared(self.vid) + s = self.data_mod.get_shared(self.sid) + tv = np.zeros(v.shape, dtype=np.float32) + ts = np.zeros(s.shape, dtype=np.float32) + W = self.W + mrC = self.mrC + R = self.R + for i in range(its): + W.FP(v,out=ts) + ts -= s + ts *= R # ts = R * (W*v - s) + + W.BP(ts,out=tv) + tv *= mrC + + v += tv # v = v - rel * C * W' * ts + + if self.min_constraint is not None or self.max_constraint is not None: + v.clip(min=self.min_constraint, max=self.max_constraint, out=v) + -- cgit v1.2.3