#if defined(_MSC_VER) #pragma warning ( disable : 4786 ) #endif // INPUTS: {BrainProtonDensitySliceBorder20.png} // INPUTS: {BrainProtonDensitySliceShifted13x17y.png} //include headers neccessary for phase correlation image registration #include "itkPhaseCorrelationImageRegistrationMethod.h" #include "itkPhaseCorrelationOperator.h" #include "itkMaxPhaseCorrelationOptimizer.h" //include headers for image, IO, casting and resampling #include "itkImageFileReader.h" #include "itkResampleImageFilter.h" #include "itkCastImageFilter.h" #include "itkImageFileWriter.h" int main( int argc, char *argv[] ) { //inputs and output are passed as command line arguments if (argc<4) { std::cout << "Usage: " << std::endl; std::cout << argv[0] << " FixedImageFile MovingImageFile" << " OutputImageFile" << std::endl; return EXIT_FAILURE; } // // read the images // const unsigned int Dimension = 2; typedef float PixelType; typedef itk::Image< PixelType, Dimension > ImageType; typedef itk::ImageFileReader ReaderType; ReaderType::Pointer fixedReader = ReaderType::New(); ReaderType::Pointer movingReader = ReaderType::New(); fixedReader->SetFileName( argv[1] ); movingReader->SetFileName( argv[2] ); try { fixedReader->Update(); movingReader->Update(); } catch (itk::ExceptionObject & e) { std::cerr << "Unable to read input images!" << std::endl; std::cerr << e << std::endl; return EXIT_FAILURE; } // // init the registration method // typedef itk::PhaseCorrelationImageRegistrationMethod RegistrationType; typedef itk::PhaseCorrelationOperator OperatorType; typedef itk::MaxPhaseCorrelationOptimizer OptimizerType; RegistrationType::Pointer pcmRegistration = RegistrationType::New(); OperatorType::Pointer pcmOperator = OperatorType::New(); OptimizerType::Pointer pcmOptimizer = OptimizerType::New(); pcmRegistration->SetOperator( pcmOperator ); pcmRegistration->SetOptimizer( pcmOptimizer ); pcmRegistration->SetFixedImage( fixedReader->GetOutput() ); pcmRegistration->SetMovingImage( movingReader->GetOutput() ); // // execute the registration // try { pcmRegistration->Update(); } catch ( itk::ExceptionObject & e ) { std::cout << "Some error during registration:" << std::endl; std::cout << e << std::endl; return EXIT_FAILURE; } // // get the results // RegistrationType::ParametersType parameters = pcmRegistration->GetTransformParameters(); RegistrationType::TransformType::ConstPointer transform = pcmRegistration->GetOutput()->Get(); std::cout << "Translation found: " << parameters << std::endl; // // transform and write the moving image // typedef itk::ResampleImageFilter ResamplerType; typedef itk::Image CharImageType; typedef itk::CastImageFilter CasterType; typedef itk::ImageFileWriter WriterType; ResamplerType::Pointer resampler = ResamplerType::New(); CasterType::Pointer caster = CasterType::New(); WriterType::Pointer writer = WriterType::New(); resampler->SetOutputParametersFromImage( fixedReader->GetOutput() ); resampler->SetTransform( transform ); resampler->SetInput( movingReader->GetOutput() ); caster->SetInput( resampler->GetOutput() ); writer->SetInput( caster->GetOutput() ); writer->SetFileName( argv[3] ); try { writer->Update(); } catch(itk::ExceptionObject & e) { std::cerr << "Unable to generate or write output image!" << std::endl; std::cerr << e << std::endl; return EXIT_FAILURE; } return EXIT_SUCCESS; }