diff options
| -rw-r--r-- | build/linux/Makefile.in | 2 | ||||
| -rw-r--r-- | python/astra/__init__.py | 1 | ||||
| -rw-r--r-- | python/astra/plugins/__init__.py | 28 | ||||
| -rw-r--r-- | python/astra/plugins/sirt.py | 90 | ||||
| -rw-r--r-- | python/builder.py | 2 | 
5 files changed, 122 insertions, 1 deletions
diff --git a/build/linux/Makefile.in b/build/linux/Makefile.in index f10f482..14027e1 100644 --- a/build/linux/Makefile.in +++ b/build/linux/Makefile.in @@ -399,8 +399,10 @@ ifeq ($(python),yes)  install-python: py  	$(INSTALL_SH) -m 755 -d @prefix@/python  	$(INSTALL_SH) -m 755 -d @prefix@/python/astra +	$(INSTALL_SH) -m 755 -d @prefix@/python/astra/plugins  	$(INSTALL_SH) -m 644 python/finalbuild/astra/*.so @prefix@/python/astra  	$(INSTALL_SH) -m 644 python/finalbuild/astra/*.py @prefix@/python/astra +	$(INSTALL_SH) -m 644 python/finalbuild/astra/plugins/*.py @prefix@/python/astra/plugins  	$(INSTALL_SH) -m 644 python/finalbuild/*.egg-info @prefix@/python/  	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"  	@echo "To use ASTRA in Python, add @prefix@/python/ to your PYTHONPATH" 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 <http://www.gnu.org/licenses/>. +# +# ----------------------------------------------------------------------- + + +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 <http://www.gnu.org/licenses/>. +# +# ----------------------------------------------------------------------- + + +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) + diff --git a/python/builder.py b/python/builder.py index dcd62d8..243888b 100644 --- a/python/builder.py +++ b/python/builder.py @@ -87,6 +87,6 @@ setup (name = 'PyASTRAToolbox',         include_dirs=[np.get_include()],         cmdclass = cmdclass,         #ext_modules = [Extension("astra","astra/astra.pyx")], -       packages=['astra'], +       packages=['astra', 'astra.plugins'],         requires=["numpy"],  	)  | 
