/*========================================================================= Program: vv http://www.creatis.insa-lyon.fr/rio/vv Authors belong to: - University of LYON http://www.universite-lyon.fr/ - Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the copyright notices for more information. It is distributed under dual licence - BSD See included LICENSE.txt file - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html ======================================================================-====*/ #ifndef clitkAffineTransformGenericFilter_txx #define clitkAffineTransformGenericFilter_txx /* ================================================= * @file clitkAffineTransformGenericFilter.txx * @author * @date * * @brief * ===================================================*/ namespace clitk { //----------------------------------------------------------- // Constructor //----------------------------------------------------------- template AffineTransformGenericFilter::AffineTransformGenericFilter() { m_Verbose=false; m_InputFileName=""; } //----------------------------------------------------------- // Update //----------------------------------------------------------- template void AffineTransformGenericFilter::Update() { // Read the Dimension and PixelType int Dimension, Components; std::string PixelType; ReadImageDimensionAndPixelType(m_InputFileName, Dimension, PixelType, Components); // Call UpdateWithDim if(Dimension==2) UpdateWithDim<2>(PixelType, Components); else if(Dimension==3) UpdateWithDim<3>(PixelType, Components); else if (Dimension==4)UpdateWithDim<4>(PixelType, Components); else { std::cout<<"Error, Only for 2, 3 or 4 Dimensions!!!"< template void AffineTransformGenericFilter::UpdateWithDim(std::string PixelType, int Components) { if (m_Verbose) std::cout << "Image was detected to be "<(); } // else if(PixelType == "unsigned_short"){ // if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and unsigned_short..." << std::endl; // UpdateWithDimAndPixelType(); // } else if (PixelType == "unsigned_char") { if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and unsigned_char..." << std::endl; UpdateWithDimAndPixelType(); } // else if (PixelType == "char"){ // if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and signed_char..." << std::endl; // UpdateWithDimAndPixelType(); // } else { if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and float..." << std::endl; UpdateWithDimAndPixelType(); } } else if (Components==3) { if (m_Verbose) std::cout << "Launching transform in "<< Dimension <<"D and 3D float (DVF)" << std::endl; UpdateWithDimAndVectorType >(); } else std::cerr<<"Number of components is "< template void AffineTransformGenericFilter::UpdateWithDimAndPixelType() { // ImageTypes typedef itk::Image InputImageType; typedef itk::Image OutputImageType; // Read the input typedef itk::ImageFileReader InputReaderType; typename InputReaderType::Pointer reader = InputReaderType::New(); reader->SetFileName( m_InputFileName); reader->Update(); typename InputImageType::Pointer input= reader->GetOutput(); //Filter typedef itk::ResampleImageFilter< InputImageType,OutputImageType > ResampleFilterType; typename ResampleFilterType::Pointer resampler = ResampleFilterType::New(); // Matrix typename itk::Matrix matrix; if (m_ArgsInfo.matrix_given) { matrix= clitk::ReadMatrix(m_ArgsInfo.matrix_arg); if (m_Verbose) std::cout<<"Reading the matrix..."< rotationMatrix=clitk::GetRotationalPartMatrix(matrix); typename itk::Vector translationPart= clitk::GetTranslationPartMatrix(matrix); // Transform typedef itk::AffineTransform AffineTransformType; typename AffineTransformType::Pointer affineTransform=AffineTransformType::New(); affineTransform->SetMatrix(rotationMatrix); affineTransform->SetTranslation(translationPart); // Interp typedef clitk::GenericInterpolator GenericInterpolatorType; typename GenericInterpolatorType::Pointer genericInterpolator=GenericInterpolatorType::New(); genericInterpolator->SetArgsInfo(m_ArgsInfo); // Properties if (m_ArgsInfo.like_given) { typename InputReaderType::Pointer likeReader=InputReaderType::New(); likeReader->SetFileName(m_ArgsInfo.like_arg); likeReader->Update(); resampler->SetOutputParametersFromImage(likeReader->GetOutput()); } else { //Size typename OutputImageType::SizeType outputSize; if (m_ArgsInfo.size_given) { for(unsigned int i=0; i< Dimension; i++) outputSize[i]=m_ArgsInfo.size_arg[i]; } else outputSize=input->GetLargestPossibleRegion().GetSize(); std::cout<<"Setting the size to "<GetSpacing(); std::cout<<"Setting the spacing to "<GetOrigin(); std::cout<<"Setting the origin to "<SetSize( outputSize ); resampler->SetOutputSpacing( outputSpacing ); resampler->SetOutputOrigin( outputOrigin ); } resampler->SetInput( input ); resampler->SetTransform( affineTransform ); resampler->SetInterpolator( genericInterpolator->GetInterpolatorPointer()); resampler->SetDefaultPixelValue( static_cast(m_ArgsInfo.pad_arg) ); try { resampler->Update(); } catch(itk::ExceptionObject) { std::cerr<<"Error resampling the image"<GetOutput(); // Output typedef itk::ImageFileWriter WriterType; typename WriterType::Pointer writer = WriterType::New(); writer->SetFileName(m_ArgsInfo.output_arg); writer->SetInput(output); writer->Update(); } //------------------------------------------------------------------- // Update with the number of dimensions and the pixeltype (components) //------------------------------------------------------------------- template template void AffineTransformGenericFilter::UpdateWithDimAndVectorType() { // ImageTypes typedef itk::Image InputImageType; typedef itk::Image OutputImageType; // Read the input typedef itk::ImageFileReader InputReaderType; typename InputReaderType::Pointer reader = InputReaderType::New(); reader->SetFileName( m_InputFileName); reader->Update(); typename InputImageType::Pointer input= reader->GetOutput(); //Filter typedef itk::VectorResampleImageFilter< InputImageType,OutputImageType, double > ResampleFilterType; typename ResampleFilterType::Pointer resampler = ResampleFilterType::New(); // Matrix typename itk::Matrix matrix; if (m_ArgsInfo.matrix_given) matrix= clitk::ReadMatrix(m_ArgsInfo.matrix_arg); else matrix.SetIdentity(); if (m_Verbose) std::cout<<"Using the following matrix:"< rotationMatrix=clitk::GetRotationalPartMatrix(matrix); typename itk::Vector translationPart= clitk::GetTranslationPartMatrix(matrix); // Transform typedef itk::AffineTransform AffineTransformType; typename AffineTransformType::Pointer affineTransform=AffineTransformType::New(); affineTransform->SetMatrix(rotationMatrix); affineTransform->SetTranslation(translationPart); // Interp typedef clitk::GenericVectorInterpolator GenericInterpolatorType; typename GenericInterpolatorType::Pointer genericInterpolator=GenericInterpolatorType::New(); genericInterpolator->SetArgsInfo(m_ArgsInfo); // Properties if (m_ArgsInfo.like_given) { typename InputReaderType::Pointer likeReader=InputReaderType::New(); likeReader->SetFileName(m_ArgsInfo.like_arg); likeReader->Update(); resampler->SetSize( likeReader->GetOutput()->GetLargestPossibleRegion().GetSize() ); resampler->SetOutputSpacing( likeReader->GetOutput()->GetSpacing() ); resampler->SetOutputOrigin( likeReader->GetOutput()->GetOrigin() ); } else { //Size typename OutputImageType::SizeType outputSize; if (m_ArgsInfo.size_given) { for(unsigned int i=0; i< Dimension; i++) outputSize[i]=m_ArgsInfo.size_arg[i]; } else outputSize=input->GetLargestPossibleRegion().GetSize(); std::cout<<"Setting the size to "<GetSpacing(); std::cout<<"Setting the spacing to "<GetOrigin(); std::cout<<"Setting the origin to "<SetSize( outputSize ); resampler->SetOutputSpacing( outputSpacing ); resampler->SetOutputOrigin( outputOrigin ); } resampler->SetInput( input ); resampler->SetTransform( affineTransform ); resampler->SetInterpolator( genericInterpolator->GetInterpolatorPointer()); resampler->SetDefaultPixelValue( static_cast(m_ArgsInfo.pad_arg) ); try { resampler->Update(); } catch(itk::ExceptionObject) { std::cerr<<"Error resampling the image"<GetOutput(); // Output typedef itk::ImageFileWriter WriterType; typename WriterType::Pointer writer = WriterType::New(); writer->SetFileName(m_ArgsInfo.output_arg); writer->SetInput(output); writer->Update(); } } //end clitk #endif //#define clitkAffineTransformGenericFilter_txx