[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