[Insight-users] 3D registration
Massinissa Bandou
Massinissa.Bandou at USherbrooke.ca
Sat Feb 22 22:48:22 EST 2014
Hi everyone,
can somebody tell me what's wrong with this code because I cant match the
source & moving image with the final matrix of transformation??
I would appreciate your help!
Massi
template<typename pixelType1, typename pixelType2>
vtkSmartPointer<vtkMatrix4x4> MutualInformation(const string source, const
string target,int iteration,pixelType1,pixelType2)
{
typedef itk::Image< pixelType1, 3 > FixedImageType;
typedef itk::Image< pixelType2, 3 > MovingImageType;
typedef itk::VersorRigid3DTransform< double > TransformType;
typedef itk::VersorRigid3DTransformOptimizer
OptimizerType;
typedef itk::MutualInformationImageToImageMetric< FixedImageType,
MovingImageType > MetricType;
typedef itk::LinearInterpolateImageFunction< MovingImageType, double >
InterpolatorType;
typedef itk::ImageRegistrationMethod< FixedImageType, MovingImageType >
RegistrationType;
MetricType::Pointer metric = MetricType::New();
OptimizerType::Pointer optimizer = OptimizerType::New();
InterpolatorType::Pointer interpolator = InterpolatorType::New();
TransformType::Pointer transform = TransformType::New();
RegistrationType::Pointer registration = RegistrationType::New();
registration->SetMetric( metric );
registration->SetOptimizer( optimizer );
registration->SetInterpolator( interpolator );
registration->SetTransform( transform );
metric->SetFixedImageStandardDeviation(4);
metric->SetMovingImageStandardDeviation(4);
typedef itk::ImageFileReader<FixedImageType> FixedImageReaderType;
typedef itk::ImageFileReader<MovingImageType> MovingImageReaderType;
FixedImageReaderType::Pointer fixedImageReader =
FixedImageReaderType::New();
MovingImageReaderType::Pointer movingImageReader =
MovingImageReaderType::New();
fixedImageReader->SetFileName(source.c_str());
movingImageReader->SetFileName(target.c_str());
registration->SetFixedImage(fixedImageReader->GetOutput());
registration->SetMovingImage( movingImageReader->GetOutput() );
try{
fixedImageReader->Update();
}catch(itk::ExceptionObject & excp){
std::cerr << excp << std::endl;
}
registration->SetFixedImageRegion(fixedImageReader->GetOutput()->GetBufferedRegion()
);
typedef
itk::CenteredTransformInitializer<TransformType,FixedImageType,MovingImageType>
TransformInitializerType;
TransformInitializerType::Pointer initializer =
TransformInitializerType::New();
initializer->SetTransform(transform);
initializer->SetFixedImage(fixedImageReader->GetOutput());
initializer->SetMovingImage(movingImageReader->GetOutput());
initializer->MomentsOn();
initializer->InitializeTransform();
typedef TransformType::VersorType VersorType;
typedef VersorType::VectorType VectorType;
VersorType rotation;
VectorType axis;
axis[0] = 0.0;
axis[1] = 0.0;
axis[2] = 1.0;
const double angle = 0;
rotation.Set( axis, angle );
transform->SetRotation( rotation );
registration->SetInitialTransformParameters( transform->GetParameters() );
typedef OptimizerType::ScalesType OptimizerScalesType;
OptimizerScalesType optimizerScales( transform->GetNumberOfParameters() );
const double translationScale = 1.0 / 1000.0;
optimizerScales[0] = 1.0;
optimizerScales[1] = 1.0;
optimizerScales[2] = 1.0;
optimizerScales[3] = translationScale;
optimizerScales[4] = translationScale;
optimizerScales[5] = translationScale;
optimizer->SetScales( optimizerScales );
optimizer->SetMaximumStepLength( 0.2000 );
optimizer->SetMinimumStepLength( 0.00000001 );
optimizer->SetNumberOfIterations( iteration );
/*monitor registration*/
CommandIterationUpdate::Pointer observer = CommandIterationUpdate::New();
observer->GetTomo(this->in);
optimizer->AddObserver(itk::IterationEvent(),observer);
try{
registration->Update();
std::cout << "Optimizer stop condition: "<<
registration->GetOptimizer()->GetStopConditionDescription()<< std::endl;
}
catch( itk::ExceptionObject & err ){
std::cerr << "ExceptionObject caught !" << std::endl;
std::cerr << err << std::endl;
}
OptimizerType::ParametersType finalParameters =
registration->GetLastTransformParameters();
const double versorX = finalParameters[0];
const double versorY = finalParameters[1];
const double versorZ = finalParameters[2];
const double finalTranslationX = finalParameters[3];
const double finalTranslationY = finalParameters[4];
const double finalTranslationZ = finalParameters[5];
const unsigned int numberOfIterations = optimizer->GetCurrentIteration();
const double bestValue = optimizer->GetValue();
std::cout << std::endl << std::endl;
std::cout << " Result = " << std::endl;
std::cout << " versor X = " << versorX << std::endl;
std::cout << " versor Y = " << versorY << std::endl;
std::cout << " versor Z = " << versorZ << 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;
transform->SetParameters( finalParameters );
TransformType::MatrixType matrix = transform->GetMatrix();
TransformType::OffsetType offset = transform->GetOffset();
std::cout<<"Matrix = "<<std::endl<<matrix<<std::endl;
std::cout<<"Offset =
"<<std::endl<<offset<<std::endl;
vtkSmartPointer<vtkMatrix4x4> matrixOfTransformation =
vtkSmartPointer<vtkMatrix4x4>::New();
for(unsigned int i=0;i<3;i++){
for(unsigned int j=0;j<3;j++){
matrixOfTransformation->SetElement(i,j,matrix(i,j));
}
}
matrixOfTransformation->SetElement(0,3,finalTranslationX );
matrixOfTransformation->SetElement(1,3,finalTranslationY );
matrixOfTransformation->SetElement(2,3,finalTranslationZ );
matrixOfTransformation->SetElement(3,0,0);
matrixOfTransformation->SetElement(3,1,0);
matrixOfTransformation->SetElement(3,2,0);
matrixOfTransformation->SetElement(3,3,1);
return matrixOfTransformation;
}
--
View this message in context: http://itk-users.7.n7.nabble.com/3D-registration-tp33441.html
Sent from the ITK - Users mailing list archive at Nabble.com.
More information about the Insight-users
mailing list