[Insight-users] Registration binary images

Serena Fabbri fabbri at u.washington.edu
Thu Oct 22 14:55:17 EDT 2009


Hi Luise and All,

I have tuned fine the parameters and now my Affine Registration works.
I am trying to enlarge the moving image,  and i have set

scaling[0]=1.5; scaling[1]=1.01; scaling[2]=1.;
transform->Scale( scaling, true );

but the registration is not good.
Are there any strategies to set scaling and shear to obtain a good deformed image?

Thank you for any suggestion.

Serena.



On Tue, 20 Oct 2009, Luis Ibanez wrote:

> 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