[Insight-users] Thin-Plate Spline Image Registration

Luis Ibanez luis.ibanez at kitware.com
Sun Oct 17 11:14:26 EDT 2010


Hi Davoud

With this Transform,  you should use an optimizer that
doesn't require the computation of Metric derivatives.

Typical options are:

* OnePlusOneEvolutionaryOptimizer
* AmoebaOptimizer


   Regards,


         Luis


--------------------------------
On Wed, Sep 22, 2010 at 10:29 AM, Dav <masslawi at gmail.com> wrote:

> Greetings dear members,
> I am trying to register pair of CT images using the Thin-Plate Spline (TPS)
> transform and the following source code is the section related to TPS
> registration:
>
>
> **********************************************************************************************************
>
> const    unsigned int    Dimension = 2;
>
>   typedef  short   PixelType;
>
>
>
>   typedef itk::Image< PixelType, Dimension >  FixedImageType;
>
>   typedef itk::Image< PixelType, Dimension >  MovingImageType;
>
>   typedef double CoordinateRepType;
>
>   typedef itk::ThinPlateSplineKernelTransform< CoordinateRepType,
> Dimension> TransformType;
>
>   typedef itk::ImageRegistrationMethod< FixedImageType, MovingImageType >
> RegistrationType;
>
>   typedef   itk::Point< CoordinateRepType, Dimension >  PointType;
>
>   typedef   TransformType::PointSetType   PointSetType;
>
>   typedef   PointSetType::Pointer      PointSetPointer;
>
>   typedef   PointSetType::PointIdentifier  PointIdType;
>
>
>
>   typedef itk::RegularStepGradientDescentOptimizer       OptimizerType;
>
>   typedef itk::MutualInformationImageToImageMetric< FixedImageType,
> MovingImageType >   MetricType;
>
>   typedef itk:: LinearInterpolateImageFunction< MovingImageType, double>
> InterpolatorType;
>
>
>
>   OptimizerType::Pointer      optimizer     = OptimizerType::New();
>
>   InterpolatorType::Pointer   interpolator  = InterpolatorType::New();
>
>   RegistrationType::Pointer   registration  = RegistrationType::New();
>
>   MetricType::Pointer         metric        = MetricType::New();
>
>
>
>
> //------------------------------------------------------------------------------------------------------//
>
>   PointSetType::Pointer sourceLandMarks = PointSetType::New();
>
>   PointSetType::Pointer targetLandMarks = PointSetType::New();
>
>   PointType p1;
>
>   PointType p2;
>
>   PointSetType::PointsContainer::Pointer sourceLandMarkContainer =
> sourceLandMarks->GetPoints();
>
>   PointSetType::PointsContainer::Pointer targetLandMarkContainer =
> targetLandMarks->GetPoints();
>
>   PointIdType id = itk::NumericTraits< PointIdType >::Zero;
>
>   // Read in the list of landmarks
>
>   std::ifstream infile;
>
>   infile.open( argv[1] );
>
>   while (!infile.eof())
>
>     {
>
>     infile >>  p1[0] >> p1[1] >> p2[0] >> p2[1];
>
>     sourceLandMarkContainer->InsertElement( id, p1 );
>
>     targetLandMarkContainer->InsertElement( id++, p2 );
>
>     }
>
>   infile.close();
>
>   TransformType::Pointer tps = TransformType::New();
>
>   tps->SetSourceLandmarks(sourceLandMarks);
>
>   tps->SetTargetLandmarks(targetLandMarks);
>
>   tps->ComputeWMatrix();
>
>
> //-------------------------------------------------------------------------------------------------------//
>
>   registration->SetOptimizer(     optimizer     );
>
>   registration->SetTransform(     tps     );
>
>   registration->SetInterpolator(  interpolator  );
>
>   registration->SetMetric(        metric        );
>
>
>
>   typedef itk::ImageFileReader< FixedImageType  > FixedImageReaderType;
>
>   typedef itk::ImageFileReader< MovingImageType > MovingImageReaderType;
>
>   FixedImageReaderType::Pointer  fixedImageReader  =
> FixedImageReaderType::New();
>
>   MovingImageReaderType::Pointer movingImageReader =
> MovingImageReaderType::New();
>
>   fixedImageReader->SetFileName(  argv[2] );
>
>   movingImageReader->SetFileName( argv[3] );
>
>
>
>   registration->SetFixedImage(    fixedImageReader->GetOutput()    );
>
>   registration->SetMovingImage(   movingImageReader->GetOutput()   );
>
>   fixedImageReader->Update();
>
>   registration->SetFixedImageRegion(
> fixedImageReader->GetOutput()->GetBufferedRegion() );
>
>
>
>   typedef RegistrationType::ParametersType ParametersType;
>
>   ParametersType initialParameters( tps->GetNumberOfParameters() );
>
>   initialParameters = tps->GetParameters();
>
>   std::cout << " TPS Parameters = " << tps->GetParameters() << std::endl;
>
>   std::cout << " TPS Parameters = " << initialParameters << std::endl;
>
>   registration->SetInitialTransformParameters( initialParameters );
>
>   optimizer->SetNumberOfIterations( 200 );
>
>   optimizer->SetRelaxationFactor( 0.9 );
>
>
>
>   try
>
>     {
>
>     registration->StartRegistration();
>
>     std::cout << "Optimizer stop condition: "
>
>               <<
> registration->GetOptimizer()->GetStopConditionDescription()
>
>               << std::endl;
>
>     }
>
>   catch( itk::ExceptionObject & err )
>
>     {
>
>     std::cout << "ExceptionObject caught !" << std::endl;
>
>     std::cout << err << std::endl;
>
>     return EXIT_FAILURE;
>     }
>
> *********************************************************************************************************
>
> This code is suppose to register two CT images with predefined landmarks
> which are the TPS transformation parameters. The code compiles just fine
> however in time of execution I get the following error:
>
> *********************************************************************************************************
>
> Location: "const class itk::Array2D<double> &__thiscall
> itk::KernelTransform<double,2>::GetJacobian(const class itk::Point<double,2>
> &) const"
>
> File: e:\research programs\[][ir]
> itk\insighttoolkit-3.18.0\code\common\itkKernelTransform.txx
>
> Line: 455
>
> Description: itk::ERROR: ThinPlateSplineKernelTransform(01571248):
> GetJacobian must be implemented in subclasses of KernelTransform.
>
> ***************************************************************************
>
> The used landmark file is similar to what have been used for
> the ThinPlateSplineWarp example in the ITK framework and I don't think that
> is the cause of error. My guess is that the parameters initialization of the
> registration method is not configured properly but I don't know how to
> correct that. I would appreciate any help to solve this issue.
>
> Best regards,
>
> Davoud.
>
>
>
>
>
> _____________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Kitware offers ITK Training Courses, for more information visit:
> http://www.kitware.com/products/protraining.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
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-users/attachments/20101017/9d7658ab/attachment.htm>


More information about the Insight-users mailing list