X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=registration%2FclitkConvertBSplineDeformableTransformToVFGenericFilter.cxx;fp=registration%2FclitkConvertBSplineDeformableTransformToVFGenericFilter.cxx;h=0d3929a097a61a3669a126366ea32c5604bc574a;hb=657652a78c2e2717a6f77e027049173442ca29f0;hp=0000000000000000000000000000000000000000;hpb=8abe9edbdc63a33f8fbb1f321073b762e08be9aa;p=clitk.git diff --git a/registration/clitkConvertBSplineDeformableTransformToVFGenericFilter.cxx b/registration/clitkConvertBSplineDeformableTransformToVFGenericFilter.cxx new file mode 100755 index 0000000..0d3929a --- /dev/null +++ b/registration/clitkConvertBSplineDeformableTransformToVFGenericFilter.cxx @@ -0,0 +1,417 @@ +/*========================================================================= + 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 clitkConvertBSplineDeformableTransformToVFGenericFilter_cxx +#define clitkConvertBSplineDeformableTransformToVFGenericFilter_cxx + +/* ================================================= + * @file clitkConvertBSplineDeformableTransformToVFGenericFilter.cxx + * @author + * @date + * + * @brief + * + ===================================================*/ + +#include "clitkConvertBSplineDeformableTransformToVFGenericFilter.h" + + +namespace clitk +{ + + + //----------------------------------------------------------- + // Constructor + //----------------------------------------------------------- + ConvertBSplineDeformableTransformToVFGenericFilter::ConvertBSplineDeformableTransformToVFGenericFilter() + { + m_Verbose=false; + m_InputFileName=""; + } + + //------------------------------------------------------------------- + // Update with the number of dimensions + //------------------------------------------------------------------- + template<> + void + ConvertBSplineDeformableTransformToVFGenericFilter::UpdateWithDim<3>(std::string PixelType, int Components) + { + // Components + if (Components !=3) + { + std::cerr<<"Number of components is "< InputPixelType; + typedef itk::Vector OutputPixelType; + typedef itk::Image InputImageType; + typedef itk::Image OutputImageType; + + // Read the input + typedef itk::ImageFileReader InputReaderType; + InputReaderType::Pointer reader = InputReaderType::New(); + reader->SetFileName( m_InputFileName); + reader->Update(); + InputImageType::Pointer input= reader->GetOutput(); + + + // ----------------------------------------------- + // Filter + // ----------------------------------------------- + typedef itk::TransformToDeformationFieldSource ConvertorType; + ConvertorType::Pointer filter= ConvertorType::New(); + + //Output image info + if (m_ArgsInfo.like_given) + { + typedef itk::ImageFileReader ReaderType; + ReaderType::Pointer reader2=ReaderType::New(); + reader2->SetFileName(m_ArgsInfo.like_arg); + reader2->Update(); + + OutputImageType::Pointer image=reader2->GetOutput(); + filter->SetOutputParametersFromImage(image); + } + else + { + unsigned int i=0; + if(m_ArgsInfo.origin_given) + { + OutputImageType::PointType origin; + for(i=0;iSetOutputOrigin(origin); + } + if (m_ArgsInfo.spacing_given) + { + OutputImageType::SpacingType spacing; + for(i=0;iSetOutputSpacing(spacing); + } + if (m_ArgsInfo.spacing_given) + { + OutputImageType::SizeType size; + for(i=0;iSetOutputSize(size); + } + } + + if (m_Verbose) + { + std::cout<< "Setting output origin to "<GetOutputOrigin()<<"..."<GetOutputSpacing()<<"..."<GetOutputSize()<<"..."< TransformType; + TransformType::Pointer transform=TransformType::New(); + + // Spline orders: Default is cubic splines + InputImageType::RegionType::SizeType splineOrders ; + splineOrders.Fill(3); + if (m_ArgsInfo.order_given) + for(unsigned int i=0; i MaskType; + MaskType::Pointer spatialObjectMask=NULL; + if (m_ArgsInfo.mask_given) + { + typedef itk::Image< unsigned char, Dimension > ImageMaskType; + typedef itk::ImageFileReader< ImageMaskType > MaskReaderType; + MaskReaderType::Pointer maskReader = MaskReaderType::New(); + maskReader->SetFileName(m_ArgsInfo.mask_arg); + + try + { + maskReader->Update(); + } + catch( itk::ExceptionObject & err ) + { + std::cerr << "ExceptionObject caught while reading mask !" << std::endl; + std::cerr << err << std::endl; + return; + } + if (m_Verbose)std::cout <<"Mask was read..." <SetImage( maskReader->GetOutput() ); + } + + + // Samplingfactors + InputImageType::SizeType samplingFactors; + for (unsigned int i=0; i< Dimension; i++) + { + samplingFactors[i]= (int) ( input->GetSpacing()[i]/ filter->GetOutputSpacing()[i]); + if (m_Verbose) std::cout<<"Setting sampling factor "<SetSplineOrders(splineOrders); + transform->SetMask(spatialObjectMask); + transform->SetLUTSamplingFactors(samplingFactors); + transform->SetCoefficientImage(input); + filter->SetTransform(transform); + + + // ----------------------------------------------- + // Update + // ----------------------------------------------- + if (m_Verbose)std::cout<< "Converting the BSpline transform..."<Update(); + } + catch (itk::ExceptionObject) + { + std::cerr<<"Error: Exception thrown during execution convertion filter!"<GetOutput(); + + + // ----------------------------------------------- + // Output + // ----------------------------------------------- + typedef itk::ImageFileWriter WriterType; + WriterType::Pointer writer = WriterType::New(); + writer->SetFileName(m_ArgsInfo.output_arg); + writer->SetInput(output); + writer->Update(); + + } + + + //------------------------------------------------------------------- + // Update with the number of dimensions + //------------------------------------------------------------------- + template<> + void + ConvertBSplineDeformableTransformToVFGenericFilter::UpdateWithDim<4>(std::string PixelType, int Components) + { + // Components + if (Components !=3) + { + std::cerr<<"Number of components is "< InputPixelType; + typedef itk::Vector OutputPixelType; + typedef itk::Image InputImageType; + typedef itk::Image OutputImageType; + + // Read the input + typedef itk::ImageFileReader InputReaderType; + InputReaderType::Pointer reader = InputReaderType::New(); + reader->SetFileName( m_InputFileName); + reader->Update(); + InputImageType::Pointer input= reader->GetOutput(); + + + // ----------------------------------------------- + // Filter + // ----------------------------------------------- + typedef clitk::TransformToDeformationFieldSource ConvertorType; + ConvertorType::Pointer filter= ConvertorType::New(); + + //Output image info + if (m_ArgsInfo.like_given) + { + typedef itk::ImageFileReader ReaderType; + ReaderType::Pointer reader2=ReaderType::New(); + reader2->SetFileName(m_ArgsInfo.like_arg); + reader2->Update(); + + OutputImageType::Pointer image=reader2->GetOutput(); + filter->SetOutputParametersFromImage(image); + } + else + { + unsigned int i=0; + if(m_ArgsInfo.origin_given) + { + OutputImageType::PointType origin; + for(i=0;iSetOutputOrigin(origin); + } + if (m_ArgsInfo.spacing_given) + { + OutputImageType::SpacingType spacing; + for(i=0;iSetOutputSpacing(spacing); + } + if (m_ArgsInfo.spacing_given) + { + OutputImageType::SizeType size; + for(i=0;iSetOutputSize(size); + } + } + //Output image info + if (m_Verbose) + { + std::cout<< "Setting output origin to "<GetOutputOrigin()<<"..."<GetOutputSpacing()<<"..."<GetOutputSize()<<"..."< TransformType; + TransformType::Pointer transform=TransformType::New(); + transform->SetTransformShape(m_ArgsInfo.shape_arg); + + // Spline orders: Default is cubic splines + InputImageType::RegionType::SizeType splineOrders ; + splineOrders.Fill(3); + if (m_ArgsInfo.order_given) + for(unsigned int i=0; i MaskType; + MaskType::Pointer spatialObjectMask=NULL; + if (m_ArgsInfo.mask_given) + { + typedef itk::Image< unsigned char, Dimension > ImageMaskType; + typedef itk::ImageFileReader< ImageMaskType > MaskReaderType; + MaskReaderType::Pointer maskReader = MaskReaderType::New(); + maskReader->SetFileName(m_ArgsInfo.mask_arg); + + try + { + maskReader->Update(); + } + catch( itk::ExceptionObject & err ) + { + std::cerr << "ExceptionObject caught while reading mask !" << std::endl; + std::cerr << err << std::endl; + return; + } + if (m_Verbose)std::cout <<"Mask was read..." <SetImage( maskReader->GetOutput() ); + } + + + // Samplingfactors + InputImageType::SizeType samplingFactors; + for (unsigned int i=0; i< Dimension; i++) + { + samplingFactors[i]= (int) ( input->GetSpacing()[i]/ filter->GetOutputSpacing()[i]); + if (m_Verbose) std::cout<<"Setting sampling factor "<SetSplineOrders(splineOrders); + transform->SetMask(spatialObjectMask); + transform->SetLUTSamplingFactors(samplingFactors); + transform->SetCoefficientImage(input); + filter->SetTransform(transform); + + + // ----------------------------------------------- + // Update + // ----------------------------------------------- + if (m_Verbose)std::cout<< "Converting the BSpline transform..."<Update(); + } + catch (itk::ExceptionObject) + { + std::cerr<<"Error: Exception thrown during execution convertion filter!"<GetOutput(); + + + // ----------------------------------------------- + // Output + // ----------------------------------------------- + typedef itk::ImageFileWriter WriterType; + WriterType::Pointer writer = WriterType::New(); + writer->SetFileName(m_ArgsInfo.output_arg); + writer->SetInput(output); + writer->Update(); + + } + + + + //----------------------------------------------------------- + // Update + //----------------------------------------------------------- + void ConvertBSplineDeformableTransformToVFGenericFilter::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); + if(Dimension==3) UpdateWithDim<3>(PixelType, Components); + else if (Dimension==4) UpdateWithDim<4>(PixelType, Components); + else + { + std::cout<<"Error, Only for 3 Dimensions!!!"<