#include "itkTransform.h" #include "itkTransformFileReader.h" #include "itkCenteredSimilarity2DTransform.h" #include "itkTransformFactory.h" #include "itkSerialTransform.h" #include "itkImageFileReader.h" #include "itkImageFileWriter.h" #include "itkResampleImageFilter.h" int main( const int argc, const char* argv[] ) { if( argc < 5 ) { std::cerr << "Missing Parameters " << std::endl; std::cerr << "Usage: " << argv[0]; std::cerr << " fixedImageFile movingImageFile outputImagefile "; std::cerr << " transformFile0 [transformFile1 ...] "; return 1; } const char* argvFixedImagePath = argv[1]; const char* argvMovingImagePath = argv[2]; const char* argvOutImagePath = argv[3]; const int argcTransformList = 4; const unsigned int ImageDimension = 2; const unsigned int SpaceDimension = ImageDimension; typedef double CoordinateRepType; typedef unsigned char ReadPixelType; typedef itk::Image< ReadPixelType, ImageDimension > ReadImageType; typedef unsigned char WritePixelType; typedef itk::Image< WritePixelType, ImageDimension > WriteImageType; typedef itk::ImageFileReader< ReadImageType > FixedImageReaderType; typedef itk::ImageFileReader< ReadImageType > MovingImageReaderType; FixedImageReaderType::Pointer fixedImageReader = FixedImageReaderType::New(); MovingImageReaderType::Pointer movingImageReader = MovingImageReaderType::New(); fixedImageReader->SetFileName( argvFixedImagePath ); fixedImageReader->Update(); movingImageReader->SetFileName( argvMovingImagePath ); typedef itk::SerialTransform SerialTransformType; typedef SerialTransformType::TransformType TransformType; SerialTransformType::Pointer serialTransform = SerialTransformType::New(); typedef itk::CenteredSimilarity2DTransform< CoordinateRepType > SimilarityTransformType; itk::TransformFactory::RegisterTransform(); typedef itk::TransformFileReader TransformReaderType; typedef TransformReaderType::TransformListType TransformListType; for ( int i = argcTransformList; i < argc; ++i ) { TransformReaderType::Pointer transformReader = TransformReaderType::New(); transformReader->SetFileName( argv[i] ); transformReader->Update(); TransformReaderType::TransformListType* tlist = transformReader->GetTransformList(); TransformReaderType::TransformListType::iterator it = tlist->begin(); while ( it != tlist->end() ) { // we have to dynamic_cast here because the reader does not store pointers to // the concrete transformation classes (ie., with the correct coordinate space // dimensions etc.) serialTransform->AddTransform( dynamic_cast( (*it).GetPointer() ) ); ++it; } } typedef itk::ResampleImageFilter ResampleFilterType; ResampleFilterType::Pointer resample = ResampleFilterType::New(); resample->SetTransform( serialTransform ); resample->SetInput( movingImageReader->GetOutput() ); ReadImageType::ConstPointer fixedImage = fixedImageReader->GetOutput(); resample->SetSize( fixedImage->GetLargestPossibleRegion().GetSize() ); resample->SetOutputOrigin( fixedImage->GetOrigin() ); resample->SetOutputSpacing( fixedImage->GetSpacing() ); resample->SetDefaultPixelValue( 0 ); typedef itk::ImageFileWriter< WriteImageType > WriterType; WriterType::Pointer writer = WriterType::New(); writer->SetFileName( argvOutImagePath ); writer->SetInput( resample->GetOutput() ); try { writer->Update(); } catch( itk::ExceptionObject & err ) { std::cerr << "ExceptionObject caught !" << std::endl; std::cerr << err << std::endl; return -1; } return 0; }