[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