[Insight-users] re gistration error RegularStepGradientDescentOptimizer

EsmeRuiz esmeralda.ruizpujadas at gmail.com
Mon Feb 21 05:56:28 EST 2011


Hello, I am new with ITK. And I have tried to do a model based registration
using regular step gradient descent optimizer and I get this error

The size of Scales 6, but the NumberOfParameters for the CostFunction is 3.

I don't understand what it means.

The code is:

void registrations::modelBasedRegistration(float **imgFIXED, int size_row,
int size_col, int absFrame){


	  typedef itk::GroupSpatialObject< 2 >     GroupType;
	  typedef itk::EllipseSpatialObject< 2 >   EllipseType;
	  typedef itk::Image< float, 2 >      ImageType;

	  EllipseType::Pointer ellipse1 = EllipseType::New();
	  EllipseType::Pointer ellipse2 = EllipseType::New();
	  //EllipseType::Pointer ellipse3 = EllipseType::New();

	  	 
	  ellipse1->SetRadius(  1.0  );
	  ellipse2->SetRadius(  2.0  );


	  //  Software Guide : BeginCodeSnippet
	  EllipseType::TransformType::OffsetType offset;
	  offset[ 0 ] = (int)size_col/2.0;
	  offset[ 1 ] = (int)size_row/2.0;

	  ellipse1->GetObjectToParentTransform()->SetOffset(offset);
	  ellipse1->ComputeObjectToWorldTransform();
	 

	  offset[ 0 ] = (int)size_col/2.0;
	  offset[ 1 ] = (int)size_row/2.0;

	  ellipse2->GetObjectToParentTransform()->SetOffset(offset);
	  ellipse2->ComputeObjectToWorldTransform();

	  //  Software Guide : BeginCodeSnippet
	  GroupType::Pointer group = GroupType::New();
	  group->AddSpatialObject( ellipse1 );
	  group->AddSpatialObject( ellipse2 );


	  //  Software Guide : BeginCodeSnippet
	  typedef itk::SpatialObjectToImageFilter< GroupType, ImageType >  
SpatialObjectToImageFilterType;
	  //  Software Guide : EndCodeSnippet 


	  //  Software Guide : BeginCodeSnippet
	  SpatialObjectToImageFilterType::Pointer imageFilter =
SpatialObjectToImageFilterType::New();
	  //  Software Guide : EndCodeSnippet 


	  //  Software Guide : BeginCodeSnippet
	  imageFilter->SetInput(  group  );
	  //  Software Guide : EndCodeSnippet 


	  //  Software Guide : BeginCodeSnippet
	  ImageType::SizeType size;
	  size[ 0 ] = 200;
	  size[ 1 ] = 200;
	  imageFilter->SetSize( size );


	  //  Software Guide : BeginCodeSnippet
	  imageFilter->Update();
	  //  Software Guide : EndCodeSnippet 


	  //  Software Guide : BeginCodeSnippet
	  typedef itk::DiscreteGaussianImageFilter< ImageType, ImageType >  
GaussianFilterType;
	  GaussianFilterType::Pointer   gaussianFilter =  
GaussianFilterType::New();
	  //  Software Guide : EndCodeSnippet 

	  
	  //  Software Guide : BeginCodeSnippet
	  gaussianFilter->SetInput(  imageFilter->GetOutput()  );
	  //  Software Guide : EndCodeSnippet 


	  //  Software Guide : BeginCodeSnippet
	  const double variance = 20;
	  gaussianFilter->SetVariance(variance);
	  gaussianFilter->Update();
	  //  Software Guide : EndCodeSnippet 


	  // Software Guide : BeginCodeSnippet
	  typedef itk::ImageToSpatialObjectRegistrationMethod< ImageType, GroupType
> 	RegistrationType;
	  RegistrationType::Pointer registration = RegistrationType::New();

	  typedef SimpleImageToSpatialObjectMetric< ImageType, GroupType >
MetricType;
	  MetricType::Pointer metric = MetricType::New();
	  // Software Guide : EndCodeSnippet



	  // Software Guide : BeginCodeSnippet
	  typedef itk::LinearInterpolateImageFunction< ImageType, double > 
InterpolatorType;
	  InterpolatorType::Pointer interpolator = InterpolatorType::New();
	  // Software Guide : EndCodeSnippet


	  
	  typedef itk::RegularStepGradientDescentOptimizer       OptimizerType;
	  OptimizerType::Pointer      optimizer     = OptimizerType::New();
	  

	  
	  typedef itk::CenteredSimilarity2DTransform< double > TransformType;
	  TransformType::Pointer transform = TransformType::New();

	  

	  
	 
	  double steplength = 0.1; // 1.0
	  optimizer->SetMaximumStepLength( steplength ); 
	  optimizer->SetMinimumStepLength( 0.0001 );
	  
	  optimizer->SetNumberOfIterations( 500 );
	  typedef OptimizerType::ScalesType       OptimizerScalesType;
	  int numOfParameters =  transform->GetNumberOfParameters();
	  OptimizerScalesType optimizerScales( transform->GetNumberOfParameters()
);
	  const double translationScale = 1.0 / 100.0;

	  optimizerScales[0] = 10.0; 
	  optimizerScales[1] =  1.0;
	  optimizerScales[2] =  translationScale;
	  optimizerScales[3] =  translationScale;
	  optimizerScales[4] =  translationScale;
	  optimizerScales[5] =  translationScale;

	  optimizer->SetScales( optimizerScales );
	  
	  CommandIterationUpdate::Pointer observer = CommandIterationUpdate::New();
	  optimizer->AddObserver( itk::IterationEvent(), observer );


      registration->SetFixedImage( gaussianFilter->GetOutput() );
      registration->SetMovingSpatialObject( group );
      registration->SetTransform( transform );
      registration->SetInterpolator( interpolator );
      registration->SetOptimizer( optimizer );
      registration->SetMetric( metric );

	  typedef    float    InputPixelType;
	  typedef itk::Image< InputPixelType,  2 >   InputImageType;

	  typedef itk::CenteredTransformInitializer< 
										TransformType, 
										InputImageType, 
										ImageType >  TransformInitializerType;

	  TransformInitializerType::Pointer initializer =
TransformInitializerType::New();

	  initializer->SetTransform(   transform );
	  FixedImageType::Pointer fixedImageReader = FixedImageType::New();
	  CreateImage(fixedImageReader, size_row, size_col,imgFIXED);
	  initializer->SetFixedImage(  fixedImageReader );
	  initializer->SetMovingImage( imageFilter->GetOutput() );

	  initializer->MomentsOn();

	  initializer->InitializeTransform();
	  
	  double initialScale = 1.0;
	    
	  double initialAngle = 0.5;
	 
	  transform->SetScale( initialScale );
	  transform->SetAngle( initialAngle );
	  

	 
	  registration->SetInitialTransformParameters( transform->GetParameters()
);
	  //optimizer->MaximizeOn();
	  
	  //Finally, we trigger the execution of the registration process with the
	  //  \code{StartRegistration()} method. We place this call in a
	  //  \code{try/catch} block in case any exception is thrown during the
	  //  process.
	  
	  try 
		{ 
		registration->StartRegistration(); 
		} 
	  catch( itk::ExceptionObject & err ) 
		{ 
		std::cerr << "ExceptionObject caught !" << std::endl; 
		std::cerr << err << std::endl; 
		return ;
		} 
  

	  // Software Guide : BeginCodeSnippet
	  RegistrationType::ParametersType finalParameters 
		= registration->GetLastTransformParameters();

	  std::cout << "Final Solution is : " << finalParameters << std::endl;
	  // Software Guide : EndCodeSnippet







      typedef itk::ResampleImageFilter<ImageType, 
										FixedImageType > ResampleFilterType;
	  
	  TransformType::Pointer finalTransform = TransformType::New();
	  
	  finalTransform->SetParameters( finalParameters );
	  
	  ResampleFilterType::Pointer resampler = ResampleFilterType::New();

	  resampler->SetTransform( finalTransform );
	  resampler->SetInput( imageFilter->GetOutput() );

      ImageType::Pointer fixedImage =  fixedImageReader;

	  resampler->SetSize(    fixedImage->GetLargestPossibleRegion().GetSize()
);
      resampler->SetOutputOrigin(  fixedImage->GetOrigin() );
      resampler->SetOutputSpacing( fixedImage->GetSpacing() );
      resampler->SetDefaultPixelValue( 0 );
  
      typedef  unsigned char  OutputPixelType;

      typedef itk::Image< OutputPixelType, 2> OutputImageType;
  
      typedef itk::CastImageFilter< FixedImageType, OutputImageType > 
CastFilterType;
                    
      typedef itk::ImageFileWriter< OutputImageType >  writerType;


      writerType::Pointer      writer2 =  writerType::New();
      CastFilterType::Pointer  caster =  CastFilterType::New();

      writer2->SetFileName( "reg.jpg" );

      caster->SetInput( resampler->GetOutput() );
      writer2->SetInput( caster->GetOutput()   );
	  try 
	  { 
		writer2->Update();
	  } 
	  catch( itk::ExceptionObject & err ) 
	  { 
		std::cerr << "ExceptionObject caught !" << std::endl; 
		std::cerr << err << std::endl; 
		return ;
	   } 


	  return;

}

Thank you very much !!
-- 
View this message in context: http://old.nabble.com/registration-error-RegularStepGradientDescentOptimizer-tp30976153p30976153.html
Sent from the ITK - Users mailing list archive at Nabble.com.



More information about the Insight-users mailing list