17 #ifndef __itkMultiResolutionPDEDeformableRegistration_txx
18 #define __itkMultiResolutionPDEDeformableRegistration_txx
24 #include "vnl/vnl_math.h"
31 template <
class TFixedImage,
class TMovingImage,
class TDeformationField,
class TRealType>
36 this->SetNumberOfRequiredInputs(2);
39 DefaultRegistrationType::New();
43 m_MovingImagePyramid = MovingImagePyramidType::New();
44 m_FixedImagePyramid = FixedImagePyramidType::New();
45 m_FieldExpander = FieldExpanderType::New();
46 m_InitialDeformationField =
NULL;
49 m_NumberOfIterations.resize( m_NumberOfLevels );
50 m_FixedImagePyramid->SetNumberOfLevels( m_NumberOfLevels );
51 m_MovingImagePyramid->SetNumberOfLevels( m_NumberOfLevels );
54 for( ilevel = 0; ilevel < m_NumberOfLevels; ilevel++ )
56 m_NumberOfIterations[ilevel] = 10;
60 m_StopRegistrationFlag =
false;
68 template <
class TFixedImage,
class TMovingImage,
class TDeformationField,
class TRealType>
81 template <
class TFixedImage,
class TMovingImage,
class TDeformationField,
class TRealType>
95 template <
class TFixedImage,
class TMovingImage,
class TDeformationField,
class TRealType>
108 template <
class TFixedImage,
class TMovingImage,
class TDeformationField,
class TRealType>
121 template <
class TFixedImage,
class TMovingImage,
class TDeformationField,
class TRealType>
122 std::vector<SmartPointer<DataObject> >::size_type
126 typename std::vector<SmartPointer<DataObject> >::size_type num = 0;
128 if (this->GetFixedImage())
133 if (this->GetMovingImage())
145 template <
class TFixedImage,
class TMovingImage,
class TDeformationField,
class TRealType>
151 if( m_NumberOfLevels != num )
154 m_NumberOfLevels = num;
155 m_NumberOfIterations.resize( m_NumberOfLevels );
158 if( m_MovingImagePyramid && m_MovingImagePyramid->GetNumberOfLevels() != num )
160 m_MovingImagePyramid->SetNumberOfLevels( m_NumberOfLevels );
162 if( m_FixedImagePyramid && m_FixedImagePyramid->GetNumberOfLevels() != num )
164 m_FixedImagePyramid->SetNumberOfLevels( m_NumberOfLevels );
173 template <
class TFixedImage,
class TMovingImage,
class TDeformationField,
class TRealType>
178 Superclass::PrintSelf(os, indent);
179 os << indent <<
"NumberOfLevels: " << m_NumberOfLevels << std::endl;
180 os << indent <<
"CurrentLevel: " << m_CurrentLevel << std::endl;
182 os << indent <<
"NumberOfIterations: [";
184 for( ilevel = 0; ilevel < m_NumberOfLevels - 1; ilevel++ )
186 os << m_NumberOfIterations[ilevel] <<
", ";
188 os << m_NumberOfIterations[ilevel] <<
"]" << std::endl;
190 os << indent <<
"RegistrationFilter: ";
191 os << m_RegistrationFilter.GetPointer() << std::endl;
192 os << indent <<
"MovingImagePyramid: ";
193 os << m_MovingImagePyramid.GetPointer() << std::endl;
194 os << indent <<
"FixedImagePyramid: ";
195 os << m_FixedImagePyramid.GetPointer() << std::endl;
197 os << indent <<
"FieldExpander: ";
198 os << m_FieldExpander.GetPointer() << std::endl;
200 os << indent <<
"StopRegistrationFlag: ";
201 os << m_StopRegistrationFlag << std::endl;
218 template <
class TFixedImage,
class TMovingImage,
class TDeformationField,
class TRealType>
227 if( !movingImage || !fixedImage )
229 itkExceptionMacro( <<
"Fixed and/or moving image not set" );
232 if( !m_MovingImagePyramid || !m_FixedImagePyramid )
234 itkExceptionMacro( <<
"Fixed and/or moving pyramid not set" );
237 if( !m_RegistrationFilter )
239 itkExceptionMacro( <<
"Registration filter not set" );
242 if( this->m_InitialDeformationField && this->GetInput(0) )
244 itkExceptionMacro( <<
"Only one initial deformation can be given. "
245 <<
"SetInitialDeformationField should not be used in "
246 <<
"cunjunction with SetArbitraryInitialDeformationField "
251 m_MovingImagePyramid->SetInput( movingImage );
252 m_MovingImagePyramid->UpdateLargestPossibleRegion();
254 m_FixedImagePyramid->SetInput( fixedImage );
255 m_FixedImagePyramid->UpdateLargestPossibleRegion();
259 m_StopRegistrationFlag =
false;
261 unsigned int movingLevel = vnl_math_min( (
int) m_CurrentLevel,
262 (
int) m_MovingImagePyramid->GetNumberOfLevels() );
264 unsigned int fixedLevel = vnl_math_min( (
int) m_CurrentLevel,
265 (
int) m_FixedImagePyramid->GetNumberOfLevels() );
272 if ( this->m_InitialDeformationField )
274 tempField = this->m_InitialDeformationField;
282 tempField = inputPtr;
285 DeformationFieldType> GaussianFilterType;
286 typename GaussianFilterType::Pointer smoother
287 = GaussianFilterType::New();
289 for (
unsigned int dim=0; dim<DeformationFieldType::ImageDimension; ++dim)
292 double sigma = 0.5 *
static_cast<float>(
293 m_FixedImagePyramid->GetSchedule()[fixedLevel][dim] );
296 sigma *= fixedImage->GetSpacing()[dim]
297 / inputPtr->GetSpacing()[dim];
299 smoother->SetInput( tempField );
300 smoother->SetSigma( sigma );
301 smoother->SetDirection( dim );
305 tempField = smoother->GetOutput();
306 tempField->DisconnectPipeline();
311 m_FieldExpander->SetInput( tempField );
314 m_FixedImagePyramid->GetOutput( fixedLevel );
315 m_FieldExpander->SetSize(
316 fi->GetLargestPossibleRegion().GetSize() );
317 m_FieldExpander->SetOutputStartIndex(
318 fi->GetLargestPossibleRegion().GetIndex() );
319 m_FieldExpander->SetOutputOrigin( fi->GetOrigin() );
320 m_FieldExpander->SetOutputSpacing( fi->GetSpacing());
321 m_FieldExpander->SetOutputDirection( fi->GetDirection());
323 m_FieldExpander->UpdateLargestPossibleRegion();
324 m_FieldExpander->SetInput(
NULL );
325 tempField = m_FieldExpander->GetOutput();
326 tempField->DisconnectPipeline();
329 bool lastShrinkFactorsAllOnes =
false;
331 while ( !this->Halt() )
334 if( tempField.IsNull() )
336 m_RegistrationFilter->SetInitialDeformationField(
NULL );
342 m_FieldExpander->SetInput( tempField );
345 m_FixedImagePyramid->GetOutput( fixedLevel );
346 m_FieldExpander->SetSize(
347 fi->GetLargestPossibleRegion().GetSize() );
348 m_FieldExpander->SetOutputStartIndex(
349 fi->GetLargestPossibleRegion().GetIndex() );
350 m_FieldExpander->SetOutputOrigin( fi->GetOrigin() );
351 m_FieldExpander->SetOutputSpacing( fi->GetSpacing());
352 m_FieldExpander->SetOutputDirection( fi->GetDirection());
354 m_FieldExpander->UpdateLargestPossibleRegion();
355 m_FieldExpander->SetInput(
NULL );
356 tempField = m_FieldExpander->GetOutput();
357 tempField->DisconnectPipeline();
359 m_RegistrationFilter->SetInitialDeformationField( tempField );
364 m_RegistrationFilter->SetMovingImage( m_MovingImagePyramid->GetOutput(movingLevel) );
365 m_RegistrationFilter->SetFixedImage( m_FixedImagePyramid->GetOutput(fixedLevel) );
367 m_RegistrationFilter->SetNumberOfIterations(
368 m_NumberOfIterations[m_CurrentLevel] );
371 lastShrinkFactorsAllOnes =
true;
372 for(
unsigned int idim = 0; idim < ImageDimension; idim++ )
374 if ( m_FixedImagePyramid->GetSchedule()[fixedLevel][idim] > 1 )
376 lastShrinkFactorsAllOnes =
false;
382 m_RegistrationFilter->UpdateLargestPossibleRegion();
383 tempField = m_RegistrationFilter->GetOutput();
384 tempField->DisconnectPipeline();
388 movingLevel = vnl_math_min( (
int) m_CurrentLevel,
389 (
int) m_MovingImagePyramid->GetNumberOfLevels() );
390 fixedLevel = vnl_math_min( (
int) m_CurrentLevel,
391 (
int) m_FixedImagePyramid->GetNumberOfLevels() );
397 if ( movingLevel > 0 )
399 m_MovingImagePyramid->GetOutput( movingLevel - 1 )->ReleaseData();
403 m_FixedImagePyramid->GetOutput( fixedLevel - 1 )->ReleaseData();
408 if( !lastShrinkFactorsAllOnes )
415 m_FieldExpander->SetInput( tempField );
416 m_FieldExpander->SetSize(
417 fixedImage->GetLargestPossibleRegion().GetSize() );
418 m_FieldExpander->SetOutputStartIndex(
419 fixedImage->GetLargestPossibleRegion().GetIndex() );
420 m_FieldExpander->SetOutputOrigin( fixedImage->GetOrigin() );
421 m_FieldExpander->SetOutputSpacing( fixedImage->GetSpacing());
422 m_FieldExpander->SetOutputDirection( fixedImage->GetDirection());
424 m_FieldExpander->UpdateLargestPossibleRegion();
425 this->GraftOutput( m_FieldExpander->GetOutput() );
432 this->GraftOutput( tempField );
436 m_FieldExpander->SetInput(
NULL );
437 m_FieldExpander->GetOutput()->ReleaseData();
438 m_RegistrationFilter->SetInput(
NULL );
439 m_RegistrationFilter->GetOutput()->ReleaseData();
444 template <
class TFixedImage,
class TMovingImage,
class TDeformationField,
class TRealType>
449 m_RegistrationFilter->StopRegistration();
450 m_StopRegistrationFlag =
true;
453 template <
class TFixedImage,
class TMovingImage,
class TDeformationField,
class TRealType>
459 if (m_NumberOfLevels != 0)
461 this->UpdateProgress( static_cast<float>( m_CurrentLevel ) /
462 static_cast<float>( m_NumberOfLevels ) );
465 if ( m_CurrentLevel >= m_NumberOfLevels )
469 if ( m_StopRegistrationFlag )
481 template <
class TFixedImage,
class TMovingImage,
class TDeformationField,
class TRealType>
489 if( this->GetInput(0) )
493 this->Superclass::GenerateOutputInformation();
496 else if( this->GetFixedImage() )
500 for (
unsigned int idx = 0; idx <
501 this->GetNumberOfOutputs(); ++idx )
503 output = this->GetOutput(idx);
506 output->CopyInformation(this->GetFixedImage());
515 template <
class TFixedImage,
class TMovingImage,
class TDeformationField,
class TRealType>
522 Superclass::GenerateInputRequestedRegion();
529 movingPtr->SetRequestedRegionToLargestPossibleRegion();
542 inputPtr->SetRequestedRegion( outputPtr->GetRequestedRegion() );
547 fixedPtr->SetRequestedRegion( outputPtr->GetRequestedRegion() );
553 template <
class TFixedImage,
class TMovingImage,
class TDeformationField,
class TRealType>
560 Superclass::EnlargeOutputRequestedRegion( ptr );
568 outputPtr->SetRequestedRegionToLargestPossibleRegion();