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://oncora1.lyon.fnclcc.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);
63 std::cout<<"Error, Only for 2 or 3 Dimensions!!!"<<std::endl ;
68 //-------------------------------------------------------------------
69 // Update with the number of dimensions
70 //-------------------------------------------------------------------
71 template<class args_info_type>
72 template<unsigned int Dimension>
74 InvertVFGenericFilter<args_info_type>::UpdateWithDim(std::string PixelType)
76 if (m_Verbose) std::cout << "Image was detected to be "<<Dimension<<"D and "<< PixelType<<"..."<<std::endl;
78 // if(PixelType == "short"){
79 // if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and signed short..." << std::endl;
80 // UpdateWithDimAndPixelType<Dimension, signed short>();
82 // else if(PixelType == "unsigned_short"){
83 // if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and unsigned_short..." << std::endl;
84 // UpdateWithDimAndPixelType<Dimension, unsigned short>();
87 // else if (PixelType == "unsigned_char"){
88 // if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and unsigned_char..." << std::endl;
89 // UpdateWithDimAndPixelType<Dimension, unsigned char>();
92 // else if (PixelType == "char"){
93 // if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and signed_char..." << std::endl;
94 // UpdateWithDimAndPixelType<Dimension, signed char>();
97 if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and float..." << std::endl;
98 UpdateWithDimAndPixelType<Dimension, itk::Vector<float, Dimension> >();
103 //-------------------------------------------------------------------
104 // Update with the number of dimensions and the pixeltype
105 //-------------------------------------------------------------------
106 template<class args_info_type>
107 template <unsigned int Dimension, class PixelType>
109 InvertVFGenericFilter<args_info_type>::UpdateWithDimAndPixelType()
113 typedef itk::Image<PixelType, Dimension> InputImageType;
114 typedef itk::Image<PixelType, Dimension> OutputImageType;
117 typedef itk::ImageFileReader<InputImageType> InputReaderType;
118 typename InputReaderType::Pointer reader = InputReaderType::New();
119 reader->SetFileName( m_InputFileName);
121 typename InputImageType::Pointer input= reader->GetOutput();
124 typename OutputImageType::Pointer output;
125 switch (m_ArgsInfo.type_arg)
131 // Create the InvertVFFilter
132 typedef clitk::InvertVFFilter<InputImageType,OutputImageType> FilterType;
133 typename FilterType::Pointer filter =FilterType::New();
134 filter->SetInput(input);
135 filter->SetVerbose(m_Verbose);
136 if (m_ArgsInfo.threads_given) filter->SetNumberOfThreads(m_ArgsInfo.threads_arg);
137 if (m_ArgsInfo.pad_given)
140 if (m_ArgsInfo.pad_given != (pad.GetNumberOfComponents()) )
141 pad.Fill(m_ArgsInfo.pad_arg[0]);
143 for(unsigned int i=0; i<Dimension; i++)
144 pad[i]=m_ArgsInfo.pad_arg[i];
146 filter->SetThreadSafe(m_ArgsInfo.threadSafe_flag);
148 output=filter->GetOutput();
155 // Create the InverseDeformationFieldFilter
156 typedef itk::InverseDeformationFieldImageFilter<InputImageType,OutputImageType> FilterType;
157 typename FilterType::Pointer filter =FilterType::New();
158 filter->SetInput(input);
159 filter->SetOutputOrigin(input->GetOrigin());
160 filter->SetOutputSpacing(input->GetSpacing());
161 filter->SetSize(input->GetLargestPossibleRegion().GetSize());
162 filter->SetSubsamplingFactor(m_ArgsInfo.sampling_arg);
164 output=filter->GetOutput();
172 typedef itk::ImageFileWriter<OutputImageType> WriterType;
173 typename WriterType::Pointer writer = WriterType::New();
174 writer->SetFileName(m_ArgsInfo.output_arg);
175 writer->SetInput(output);
183 #endif //#define clitkInvertVFGenericFilter_txx