[Insight-users] Registration binary images
Luis Ibanez
luis.ibanez at kitware.com
Tue Oct 20 14:50:11 EDT 2009
Hi Serena,
You want to fine tune the following parameters:
optimizer->SetParametersConvergenceTolerance( 0.25 ); // quarter pixel
optimizer->SetFunctionConvergenceTolerance(0.1); // 0.1%
You probably copy them from the example ImageRegistration10.cxx.
They were fine for a TranslationTransform, but they are not good
for an AffineTransform.
This is because the dynamic range of the rotation parameters
is proportional to radians (and scaling), and a step of 0.25 is
enormous in that space.
For your convenience, we just added a new example to the repository,
illustrating how to perform registration using the AffineTransform.
This new Example is
Insight/Examples/Registration/ImageRegistration19.cxx
it is based on ImageRegistration10.cxx.
We replaced the TranslationTransform with an AffineTransform,
added a CenteredTransformInitializer and fine tunned the convergence
parameters of the AmoebaOptimizers.
You will find this new example at:
http://public.kitware.com/cgi-bin/viewcvs.cgi/Examples/Registration/ImageRegistration19.cxx?root=Insight&sortby=date&view=log
You could get the source code by clicking on the "download" link,
or by updating your CVS checkout of ITK (if you have one).
A test has been defined for this example.
You can run it with:
ctest -R ImageRegistration19 -V
Please give it a try and let us know if you find any problems,
Thanks
Luis
-----------------------------------------------------------------------
On Fri, Oct 16, 2009 at 9:17 PM, Serena Fabbri <fabbri at u.washington.edu> wrote:
>
> Hi All,
>
> I am registering binary images with Affine Transformation, MatchCardinality
> Metric, Amoeba optimizer, NearestNeighbor Interpolator.
> When I set optimizerScales with SetScales( optimizerScales ), I obtain this
> message independently by chosen values.
>
> ExceptionObject caught !
>
> itk::ExceptionObject (0x66d6a0)
> Location: "typename itk::MatchCardinalityImageToImageMetric<TFixedImage,
> TMovingImage>::MeasureType
> itk::MatchCardinalityImageToImageMetric<TFixedImage,
> TMovingImage>::GetNonconstValue(const typename
> itk::ImageToImageMetric<TFixedImage,
> TMovingImage>::TransformParametersType&) [with TFixedImage = main(int,
> char**)::FixedImageType, TMovingImage = main(int, char**)::MovingImageType]"
> File: /Users/physics/InsightToolkit-
> 3.10.0/Code/Algorithms/itkMatchCardinalityImageToImageMetric.txx
> Line: 130
> Description: itk::ERROR: MatchCardinalityImageToImageMetric(0x6690c0): All
> the points mapped to outside of the moving image
>
>
>
> If I don't set optimizerScales the registration starts but I have another
> problem.
> I visualize the registration task with an observer with these 2 instruction:
> std::cout << optimizer->GetCachedCurrentPosition()<< " ";
> std::cout << optimizer->GetCachedValue() ;
>
> and it seems work but when I call
> OptimizerType::ParametersType finalParameters =
> registration->GetLastTransformParameters();
> I get the initial parameters, so the output image is not registered.
>
> does anyone experience with Affine Registration of binary image?
> Could you give me any suggestion?
> Thank you for any advice.
> Serena.
>
>
> this is the code:
>
>
>
>
> // Metric
>
> metric->MeasureMatchesOff();
>
> // Transform
> TransformInitializerType::Pointer initializer =
> TransformInitializerType::New();
> initializer->SetTransform( transform );
> initializer->SetFixedImage( fixedImageReader->GetOutput() );
> initializer->SetMovingImage( movingImageReader->GetOutput() );
> initializer->GeometryOn();
> initializer->InitializeTransform();
>
>
> //Optimizer
> unsigned int maxNumberOfIterations = 2000;
>
> if( argc > 3 )
> {
> maxNumberOfIterations = atoi( argv[4] );
> }
>
> OptimizerType::ParametersType
> simplexDelta( transform->GetNumberOfParameters() );
> simplexDelta.Fill( 10.0 );
> std::cout<<"simplexDelta "<<simplexDelta<<std::endl;
> std::cout<<"GetScales() "<<optimizer->GetScales()<<std::endl;
> typedef OptimizerType::ScalesType OptimizerScalesType;
> OptimizerScalesType optimizerScales(
> transform->GetNumberOfParameters() );
>
> optimizerScales[0] = 1.000;
> optimizerScales[1] = 1.000;
> optimizerScales[2] = 1.000;
>
> optimizerScales[3] = 1.000;
> optimizerScales[4] = 1.000;
> optimizerScales[5] = 1.000;
>
> optimizerScales[6] = 1.000;
> optimizerScales[7] = 1.000;
> optimizerScales[8] = 1.000;
>
> double translationScale = 1.000;
> optimizerScales[9] = translationScale;
> optimizerScales[10] = translationScale;
> optimizerScales[11] = translationScale;
>
> optimizer->SetScales( optimizerScales );
> std::cout<<"GetScales() "<<optimizer->GetScales()<<std::endl;
> optimizer->AutomaticInitialSimplexOff();
> optimizer->SetInitialSimplexDelta( simplexDelta );
> optimizer->SetParametersConvergenceTolerance( 0.25 ); // quarter
> pixel
> optimizer->SetFunctionConvergenceTolerance(0.1); // 0.1%
> optimizer->SetMaximumNumberOfIterations(maxNumberOfIterations );
>
> //Registration
> registration->SetMetric(
> metric );
> registration->SetOptimizer(
> optimizer );
> registration->SetInterpolator(
> interpolator );
> registration->SetTransform(
> transform );
> registration->SetFixedImage(
> fixedImageReader->GetOutput() );
> registration->SetMovingImage(
> movingImageReader->GetOutput() );
> registration->SetFixedImageRegion(
> fixedImageReader->GetOutput()-
>>
>> GetBufferedRegion() );
>
> registration->SetInitialTransformParameters(
> transform->GetParameters() );
>
> // Osservatori
> itkProbesCreate();
> CommandIterationUpdate::Pointer observer =
> CommandIterationUpdate::New();
> optimizer->AddObserver( itk::IterationEvent(), observer);
>
> std::cout << std::endl << "Starting Affine Registration " << std::endl;
> std::cout << transform->GetNumberOfParameters()<< " " <<
> transform-
>>
>> GetParameters()<<std::endl;
>
> try
> {
> registration->Initialize();
> std::cout << "Initial Metric value = "<<
> metric->GetValue(transform-
>>
>> GetNumberOfParameters() ) << std::endl;
>
> itkProbesStart( "Affine Registration " );
> registration->StartRegistration();
> itkProbesStop( "Affine Registration " );
> }
> catch( itk::ExceptionObject & err )
> {
> std::cerr << "ExceptionObject caught !" << std::endl;
> std::cerr << err << std::endl;
> return EXIT_FAILURE;
> }
> // Report the time and memory taken by the registration
> itkProbesReport( std::cout );
>
>
> std::cout << "Affine Registration completed" << std::endl;
> std::cout << std::endl;
>
>
>
>
> OptimizerType::ParametersType finalParameters =
> registration->GetLastTransformParameters();
>
> const double finalRotationCenterX = transform->GetCenter()[0];
> const double finalRotationCenterY = transform->GetCenter()[1];
> const double finalRotationCenterZ = transform->GetCenter()[2];
> const double finalTranslationX = finalParameters[9];
> const double finalTranslationY = finalParameters[10];
> const double finalTranslationZ = finalParameters[11];
>
> const unsigned int numberOfIterations =
> optimizer->GetOptimizer()->get_num_evaluations();
> const double bestValue = optimizer->GetValue();
>
>
>
> // Print out results
>
> std::cout << "Result = " << std::endl;
> std::cout << " Center X = " << finalRotationCenterX <<
> std::endl;
> std::cout << " Center Y = " << finalRotationCenterY <<
> std::endl;
> std::cout << " Center Z = " << finalRotationCenterZ <<
> std::endl;
> std::cout << " Translation X = " << finalTranslationX << std::endl;
> std::cout << " Translation Y = " << finalTranslationY << std::endl;
> std::cout << " Translation Z = " << finalTranslationZ << std::endl;
> std::cout << " Iterations = " << numberOfIterations << std::endl;
> std::cout << " Metric value = " << bestValue << std::endl;
> std::cout << " finalParameters = "<<finalParameters<<std::endl;
> std::cout << " finalParameters =
> "<<transform->GetParameters()<<std::endl;
>
> //write time
> TransformType::Pointer finalTransform = TransformType::New();
>
> finalTransform->SetCenter( transform->GetCenter() );
> finalTransform->SetParameters( finalParameters );
> resampler->SetTransform( finalTransform );
> resampler->SetInput( movingImageReader->GetOutput() );
>
> FixedImageType::Pointer fixedImage = fixedImageReader->GetOutput();
>
> resampler->SetSize( fixedImage->GetLargestPossibleRegion().GetSize() );
> resampler->SetOutputOrigin( fixedImage->GetOrigin() );
> resampler->SetOutputSpacing( fixedImage->GetSpacing() );
> resampler->SetOutputDirection( fixedImage->GetDirection() );
> resampler->SetDefaultPixelValue( 0 );
>
>
>
>
> writer->SetFileName( argv[3] );
> caster->SetInput( resampler->GetOutput() );
> writer->SetInput( caster->GetOutput() );
>
>
> try
> {
> writer->Update();
> }
> catch( itk::ExceptionObject & err )
> {
> std::cerr << "ExceptionObject caught !" << std::endl;
> std::cerr << err << std::endl;
> return EXIT_FAILURE;
> }
>
>
>
>
>
>
> _____________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Please keep messages on-topic and check the ITK FAQ at:
> http://www.itk.org/Wiki/ITK_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.itk.org/mailman/listinfo/insight-users
>
More information about the Insight-users
mailing list