ITK  4.0.0
Insight Segmentation and Registration Toolkit
itkImageRegistrationMethodv4.h
Go to the documentation of this file.
00001 /*=========================================================================
00002  *
00003  *  Copyright Insight Software Consortium
00004  *
00005  *  Licensed under the Apache License, Version 2.0 (the "License");
00006  *  you may not use this file except in compliance with the License.
00007  *  You may obtain a copy of the License at
00008  *
00009  *         http://www.apache.org/licenses/LICENSE-2.0.txt
00010  *
00011  *  Unless required by applicable law or agreed to in writing, software
00012  *  distributed under the License is distributed on an "AS IS" BASIS,
00013  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00014  *  See the License for the specific language governing permissions and
00015  *  limitations under the License.
00016  *
00017  *=========================================================================*/
00018 #ifndef __itkImageRegistrationMethodv4_h
00019 #define __itkImageRegistrationMethodv4_h
00020 
00021 #include "itkProcessObject.h"
00022 
00023 #include "itkAffineTransform.h"
00024 #include "itkCompositeTransform.h"
00025 #include "itkDataObjectDecorator.h"
00026 #include "itkObjectToObjectOptimizerBase.h"
00027 #include "itkImageToImageMetricv4.h"
00028 #include "itkInterpolateImageFunction.h"
00029 #include "itkTransform.h"
00030 #include "itkTransformParametersAdaptor.h"
00031 
00032 #include <vector>
00033 
00034 namespace itk
00035 {
00036 
00088 template<typename TFixedImage, typename TMovingImage, typename TTransform =
00089   AffineTransform<double, GetImageDimension<TFixedImage>::ImageDimension> >
00090 class ITK_EXPORT ImageRegistrationMethodv4
00091 :public ProcessObject
00092 {
00093 public:
00095   typedef ImageRegistrationMethodv4             Self;
00096   typedef ProcessObject                             Superclass;
00097   typedef SmartPointer<Self>                        Pointer;
00098   typedef SmartPointer<const Self>                  ConstPointer;
00099 
00101   itkNewMacro( Self );
00102 
00104   itkStaticConstMacro( ImageDimension, unsigned int, TFixedImage::ImageDimension );
00105 
00107   itkTypeMacro( ImageRegistrationMethodv4, ProcessObject );
00108 
00110   typedef TFixedImage                                                 FixedImageType;
00111   typedef typename FixedImageType::Pointer                            FixedImagePointer;
00112   typedef TMovingImage                                                MovingImageType;
00113   typedef typename MovingImageType::Pointer                           MovingImagePointer;
00114 
00116   typedef ImageToImageMetricv4<FixedImageType, MovingImageType>   MetricType;
00117   typedef typename MetricType::Pointer                                MetricPointer;
00118 
00119   typedef TTransform                                                  TransformType;
00120   typedef typename TransformType::Pointer                             TransformPointer;
00121   typedef typename TransformType::ScalarType                          RealType;
00122   typedef typename TransformType::DerivativeType                      DerivativeType;
00123   typedef typename DerivativeType::ValueType                          DerivativeValueType;
00124 
00125   typedef CompositeTransform<RealType, ImageDimension>                CompositeTransformType;
00126   typedef typename CompositeTransformType::Pointer                    CompositeTransformPointer;
00127 
00132   typedef DataObjectDecorator<TransformType>                          TransformOutputType;
00133   typedef typename TransformOutputType::Pointer                       TransformOutputPointer;
00134 
00136   typedef Array<SizeValueType>                                        ShrinkFactorsArrayType;
00137   typedef Array<RealType>                                             SmoothingSigmasArrayType;
00138 
00140   typedef InterpolateImageFunction<FixedImageType, RealType>          FixedInterpolatorType;
00141   typedef typename FixedInterpolatorType::Pointer                     FixedInterpolatorPointer;
00142   typedef InterpolateImageFunction<MovingImageType, RealType>         MovingInterpolatorType;
00143   typedef typename MovingInterpolatorType::Pointer                    MovingInterpolatorPointer;
00144 
00146   typedef TransformParametersAdaptor<TransformType>                   TransformParametersAdaptorType;
00147   typedef typename TransformParametersAdaptorType::Pointer            TransformParametersAdaptorPointer;
00148   typedef std::vector<TransformParametersAdaptorPointer>              TransformParametersAdaptorsContainerType;
00149 
00151   typedef ObjectToObjectOptimizerBase                                 OptimizerType;
00152   typedef typename OptimizerType::Pointer                             OptimizerPointer;
00153 
00155   itkSetInputMacro( FixedImage, FixedImageType );
00156   itkGetInputMacro( FixedImage, FixedImageType );
00158 
00160   itkSetInputMacro( MovingImage, MovingImageType );
00161   itkGetInputMacro( MovingImage, MovingImageType );
00163 
00165   itkSetObjectMacro( FixedInterpolator, FixedInterpolatorType );
00166   itkGetConstObjectMacro( FixedInterpolator, FixedInterpolatorType );
00168 
00170   itkSetObjectMacro( MovingInterpolator, MovingInterpolatorType );
00171   itkGetConstObjectMacro( MovingInterpolator, MovingInterpolatorType );
00173 
00175   itkSetObjectMacro( Metric, MetricType );
00176   itkGetObjectMacro( Metric, MetricType );
00178 
00180   itkSetObjectMacro( Transform, TransformType );
00181   itkGetObjectMacro( Transform, TransformType );
00183 
00185   itkSetObjectMacro( Optimizer, OptimizerType );
00186   itkGetObjectMacro( Optimizer, OptimizerType );
00188 
00190   itkSetObjectMacro( CompositeTransform, CompositeTransformType );
00191   itkGetObjectMacro( CompositeTransform, CompositeTransformType );
00193 
00195   void SetTransformParametersAdaptorsPerLevel( TransformParametersAdaptorsContainerType & );
00196   const TransformParametersAdaptorsContainerType & GetTransformParametersAdaptorsPerLevel() const;
00198 
00206   void SetNumberOfLevels( const SizeValueType );
00207   itkGetConstMacro( NumberOfLevels, SizeValueType );
00209 
00215   itkSetMacro( ShrinkFactorsPerLevel, ShrinkFactorsArrayType );
00216   itkGetConstMacro( ShrinkFactorsPerLevel, ShrinkFactorsArrayType );
00218 
00224   itkSetMacro( SmoothingSigmasPerLevel, SmoothingSigmasArrayType );
00225   itkGetConstMacro( SmoothingSigmasPerLevel, SmoothingSigmasArrayType );
00227 
00229   void StartRegistration() { this->GenerateData(); };
00230 
00232   typedef ProcessObject::DataObjectPointerArraySizeType DataObjectPointerArraySizeType;
00233   using Superclass::MakeOutput;
00234   virtual DataObjectPointer MakeOutput( DataObjectPointerArraySizeType );
00235 
00237   virtual const TransformOutputType * GetOutput() const;
00238 
00240   itkGetConstMacro( CurrentLevel, SizeValueType );
00241 
00242 protected:
00243   ImageRegistrationMethodv4();
00244   virtual ~ImageRegistrationMethodv4();
00245   virtual void PrintSelf( std::ostream & os, Indent indent ) const;
00246 
00248   virtual void  GenerateData();
00249 
00251   virtual void InitializeRegistrationAtEachLevel( const SizeValueType );
00252 
00253   SizeValueType                                                   m_CurrentLevel;
00254   SizeValueType                                                   m_NumberOfLevels;
00255 
00256   MovingImagePointer                                              m_MovingSmoothImage;
00257   FixedImagePointer                                               m_FixedSmoothImage;
00258 
00259   FixedInterpolatorPointer                                        m_FixedInterpolator;
00260   MovingInterpolatorPointer                                       m_MovingInterpolator;
00261 
00262   OptimizerPointer                                                m_Optimizer;
00263 
00264   MetricPointer                                                   m_Metric;
00265 
00266   ShrinkFactorsArrayType                                          m_ShrinkFactorsPerLevel;
00267   SmoothingSigmasArrayType                                        m_SmoothingSigmasPerLevel;
00268 
00269   TransformParametersAdaptorsContainerType                        m_TransformParametersAdaptorsPerLevel;
00270 
00271   CompositeTransformPointer                                       m_CompositeTransform;
00272 
00273   TransformPointer                                                m_Transform;
00274 
00275 private:
00276   ImageRegistrationMethodv4( const Self & );   //purposely not implemented
00277   void operator=( const Self & );                  //purposely not implemented
00278 };
00279 } // end namespace itk
00280 
00281 #ifndef ITK_MANUAL_INSTANTIATION
00282 #include "itkImageRegistrationMethodv4.hxx"
00283 #endif
00284 
00285 #endif
00286