cmtkDeblurringVolumeReconstruction.h

Go to the documentation of this file.
00001 /*
00002 //
00003 //  Copyright 1997-2009 Torsten Rohlfing
00004 //
00005 //  Copyright 2004-2011 SRI International
00006 //
00007 //  This file is part of the Computational Morphometry Toolkit.
00008 //
00009 //  http://www.nitrc.org/projects/cmtk/
00010 //
00011 //  The Computational Morphometry Toolkit is free software: you can
00012 //  redistribute it and/or modify it under the terms of the GNU General Public
00013 //  License as published by the Free Software Foundation, either version 3 of
00014 //  the License, or (at your option) any later version.
00015 //
00016 //  The Computational Morphometry Toolkit is distributed in the hope that it
00017 //  will be useful, but WITHOUT ANY WARRANTY; without even the implied
00018 //  warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00019 //  GNU General Public License for more details.
00020 //
00021 //  You should have received a copy of the GNU General Public License along
00022 //  with the Computational Morphometry Toolkit.  If not, see
00023 //  <http://www.gnu.org/licenses/>.
00024 //
00025 //  $Revision: 2752 $
00026 //
00027 //  $LastChangedDate: 2011-01-17 11:33:31 -0800 (Mon, 17 Jan 2011) $
00028 //
00029 //  $LastChangedBy: torstenrohlfing $
00030 //
00031 */
00032 
00033 #ifndef __cmtkDeblurringVolumeReconstruction_h_included_
00034 #define __cmtkDeblurringVolumeReconstruction_h_included_
00035 
00036 #include <cmtkconfig.h>
00037 
00038 #include <Recon/cmtkInverseInterpolationVolumeReconstructionBase.h>
00039 
00040 #include <Registration/cmtkAffineRegistration.h>
00041 
00042 #include <Base/cmtkAffineXform.h>
00043 #include <Base/cmtkUniformVolume.h>
00044 
00045 #include "Numerics/ap.h"
00046 
00047 #include <vector>
00048 
00049 namespace
00050 cmtk
00051 {
00052 
00059 template<class TPSF>
00060 class DeblurringVolumeReconstruction :
00062   public InverseInterpolationVolumeReconstructionBase
00063 {
00064 public:
00066   typedef DeblurringVolumeReconstruction<TPSF> Self;
00067 
00069   typedef InverseInterpolationVolumeReconstructionBase Superclass;
00070 
00078   DeblurringVolumeReconstruction( const UniformVolume* originalImage, const size_t numberOfPasses, const int interleaveAxis, const Types::Coordinate psfScale = 1.0 )
00079     : InverseInterpolationVolumeReconstructionBase( originalImage, numberOfPasses, interleaveAxis )
00080   { 
00081     this->m_FunctionAndGradient = new typename Self::FunctionAndGradient( this );
00082     
00083     cmtk::FixedVector<3,cmtk::Types::Coordinate> scale( originalImage->m_Delta );
00084     scale *= psfScale;
00085     scale[interleaveAxis] *= numberOfPasses;
00086     for ( size_t i = 0; i < numberOfPasses; ++i )
00087       {
00088       typename TPSF::SmartPtr psf( new TPSF( scale ) );
00089       this->m_PassImagePSF.push_back( psf );
00090       }
00091   }
00092 
00095   DeblurringVolumeReconstruction( const UniformVolume* reconstructionGrid, std::vector<UniformVolume::SmartPtr>& images, const Vector3D& psfSize )
00096     : InverseInterpolationVolumeReconstructionBase( reconstructionGrid, images )
00097   { 
00098     this->m_FunctionAndGradient = new typename Self::FunctionAndGradient( this );
00099 
00100     for ( size_t i = 0; i < images.size(); ++i )
00101       {
00102       const Vector3D scale( psfSize );
00103       typename TPSF::SmartPtr psf( new TPSF( scale ) );
00104       this->m_PassImagePSF.push_back( psf );
00105       }
00106   }
00107   
00108 private:
00110   std::vector<typename TPSF::SmartPtr> m_PassImagePSF;
00111 
00113   void Blur( const ap::real_1d_array& reconstructedPixelArray );
00114 
00116   void ComputeErrorGradientImage( ap::real_1d_array& g );
00117 
00121   void GetBoundingBoxOfXformedPassNeighborhood( int* region, 
00122                                                 const UniformVolume* correctedImage, 
00123                                                 const Vector3D& currentPassVoxel, 
00124                                                 const TPSF* psf, 
00125                                                 const AffineXform* passToCorrectedXform, 
00126                                                 const DataGrid::IndexType& correctedImageDims ) const;
00127 
00129   class FunctionAndGradient : 
00131     public ap::FunctionAndGradient
00132   {
00133   public:
00135     typedef DeblurringVolumeReconstruction FunctionType;
00136 
00138     FunctionAndGradient( FunctionType* function )
00139     {
00140       this->m_Function = function;
00141     }
00142 
00144     virtual void Evaluate( const ap::real_1d_array& x, ap::real_value_type& f, ap::real_1d_array& g );
00145 
00146   private:
00148     FunctionType* m_Function;
00149   };
00150 
00152   friend class Self::FunctionAndGradient;
00153 };
00154 
00155 #include "cmtkDeblurringVolumeReconstruction.txx"
00156 
00158 
00159 } // namespace cmtk
00160 
00161 #endif // #ifndef __cmtkDeblurringVolumeReconstruction_h_included_
00162 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines