ITK
4.0.0
Insight Segmentation and Registration Toolkit
|
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