1 /*=========================================================================
2 Program: vv http://www.creatis.insa-lyon.fr/rio/vv
5 - University of LYON http://www.universite-lyon.fr/
6 - Léon Bérard cancer center http://www.centreleonberard.fr
7 - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr
9 This software is distributed WITHOUT ANY WARRANTY; without even
10 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11 PURPOSE. See the copyright notices for more information.
13 It is distributed under dual licence
15 - BSD See included LICENSE.txt file
16 - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17 ===========================================================================**/
18 #ifndef clitkInvertVFGenericFilter_txx
19 #define clitkInvertVFGenericFilter_txx
21 /* =================================================
22 * @file clitkInvertVFGenericFilter.txx
28 ===================================================*/
34 //-----------------------------------------------------------
36 //-----------------------------------------------------------
37 template<class args_info_type>
38 InvertVFGenericFilter<args_info_type>::InvertVFGenericFilter()
45 //-----------------------------------------------------------
47 //-----------------------------------------------------------
48 template<class args_info_type>
49 void InvertVFGenericFilter<args_info_type>::Update()
51 // Read the Dimension and PixelType
53 std::string PixelType;
54 ReadImageDimensionAndPixelType(m_InputFileName, Dimension, PixelType);
58 if(Dimension==2) UpdateWithDim<2>(PixelType);
59 else if(Dimension==3) UpdateWithDim<3>(PixelType);
60 // else if (Dimension==4)UpdateWithDim<4>(PixelType);
62 std::cout<<"Error, Only for 2 or 3 Dimensions!!!"<<std::endl ;
67 //-------------------------------------------------------------------
68 // Update with the number of dimensions
69 //-------------------------------------------------------------------
70 template<class args_info_type>
71 template<unsigned int Dimension>
73 InvertVFGenericFilter<args_info_type>::UpdateWithDim(std::string PixelType)
75 if (m_Verbose) std::cout << "Image was detected to be "<<Dimension<<"D and "<< PixelType<<"..."<<std::endl;
77 // if(PixelType == "short"){
78 // if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and signed short..." << std::endl;
79 // UpdateWithDimAndPixelType<Dimension, signed short>();
81 // else if(PixelType == "unsigned_short"){
82 // if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and unsigned_short..." << std::endl;
83 // UpdateWithDimAndPixelType<Dimension, unsigned short>();
86 // else if (PixelType == "unsigned_char"){
87 // if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and unsigned_char..." << std::endl;
88 // UpdateWithDimAndPixelType<Dimension, unsigned char>();
91 // else if (PixelType == "char"){
92 // if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and signed_char..." << std::endl;
93 // UpdateWithDimAndPixelType<Dimension, signed char>();
96 if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and float..." << std::endl;
97 UpdateWithDimAndPixelType<Dimension, itk::Vector<float, Dimension> >();
102 //-------------------------------------------------------------------
103 // Update with the number of dimensions and the pixeltype
104 //-------------------------------------------------------------------
105 template<class args_info_type>
106 template <unsigned int Dimension, class PixelType>
108 InvertVFGenericFilter<args_info_type>::UpdateWithDimAndPixelType()
112 typedef itk::Image<PixelType, Dimension> InputImageType;
113 typedef itk::Image<PixelType, Dimension> OutputImageType;
116 typedef itk::ImageFileReader<InputImageType> InputReaderType;
117 typename InputReaderType::Pointer reader = InputReaderType::New();
118 reader->SetFileName( m_InputFileName);
120 typename InputImageType::Pointer input= reader->GetOutput();
123 typename OutputImageType::Pointer output;
124 switch (m_ArgsInfo.type_arg) {
128 // Create the InvertVFFilter
129 typedef clitk::InvertVFFilter<InputImageType,OutputImageType> FilterType;
130 typename FilterType::Pointer filter =FilterType::New();
131 filter->SetInput(input);
132 filter->SetVerbose(m_Verbose);
133 if (m_ArgsInfo.threads_given) filter->SetNumberOfThreads(m_ArgsInfo.threads_arg);
134 if (m_ArgsInfo.pad_given) {
136 if (m_ArgsInfo.pad_given != (pad.GetNumberOfComponents()) )
137 pad.Fill(m_ArgsInfo.pad_arg[0]);
139 for(unsigned int i=0; i<Dimension; i++)
140 pad[i]=m_ArgsInfo.pad_arg[i];
142 filter->SetThreadSafe(m_ArgsInfo.threadSafe_flag);
144 output=filter->GetOutput();
150 // Create the InverseDeformationFieldFilter
151 #if ITK_VERSION_MAJOR >= 4
152 typedef itk::InverseDisplacementFieldImageFilter<InputImageType,OutputImageType> FilterType;
154 typedef itk::InverseDeformationFieldImageFilter<InputImageType,OutputImageType> FilterType;
156 typename FilterType::Pointer filter =FilterType::New();
157 filter->SetInput(input);
158 filter->SetOutputOrigin(input->GetOrigin());
159 filter->SetOutputSpacing(input->GetSpacing());
160 filter->SetSize(input->GetLargestPossibleRegion().GetSize());
161 filter->SetSubsamplingFactor(m_ArgsInfo.sampling_arg);
163 output=filter->GetOutput();
171 typedef itk::ImageFileWriter<OutputImageType> WriterType;
172 typename WriterType::Pointer writer = WriterType::New();
173 writer->SetFileName(m_ArgsInfo.output_arg);
174 writer->SetInput(output);
182 #endif //#define clitkInvertVFGenericFilter_txx