[Insight-users] Thin-Plate Spline Registration Problem

Luis Ibanez luis.ibanez at kitware.com
Sun Oct 17 11:10:24 EDT 2010


Hi Davoud,

The TPS class has not implemented its method

               GetJacobian()

therefore, you can't use it with optimizers that
require the computation of metric derivatives.

You may try then, the following two optimizers:

A) OnePlusOneEvolutionaryOptimizer

B) AmoebaOptimizer


These two optimizers only require Metrics to
compute the GetValue() and therefore do not
invoke the GetJacobian() method in the
Transforms.


      Regards,


            Luis


----------------------------------------------------
On Thu, Sep 23, 2010 at 5:21 PM, 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/02a37c37/attachment.htm>


More information about the Insight-users mailing list