[Insight-users] Thin-Plate Spline Registration Problem
Dav
masslawi at gmail.com
Thu Sep 23 17:21:00 EDT 2010
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.txxLine: 455Description: 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.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-users/attachments/20100923/01895588/attachment.htm>
More information about the Insight-users
mailing list