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 clitkAverageTemporalDimensionGenericFilter_txx
19 #define clitkAverageTemporalDimensionGenericFilter_txx
21 /* =================================================
22 * @file clitkAverageTemporalDimensionGenericFilter.txx
28 ===================================================*/
34 //-----------------------------------------------------------
36 //-----------------------------------------------------------
37 template<class args_info_type>
38 AverageTemporalDimensionGenericFilter<args_info_type>::AverageTemporalDimensionGenericFilter()
45 //-----------------------------------------------------------
47 //-----------------------------------------------------------
48 template<class args_info_type>
49 void AverageTemporalDimensionGenericFilter<args_info_type>::Update()
51 // Read the Dimension and PixelType
52 int Dimension, Components;
53 std::string PixelType;
54 ReadImageDimensionAndPixelType(m_InputFileName, Dimension, PixelType, Components);
58 if (m_ArgsInfo.input_given>1) Dimension+=1;
59 if(Dimension==2) UpdateWithDim<2>(PixelType, Components);
60 else if(Dimension==3)UpdateWithDim<3>(PixelType, Components);
61 else if (Dimension==4)UpdateWithDim<4>(PixelType, Components);
63 std::cout<<"Error, Only for 2, 3 or 4D!!!"<<std::endl ;
68 //-------------------------------------------------------------------
69 // Update with the number of dimensions
70 //-------------------------------------------------------------------
71 template<class args_info_type>
72 template<unsigned int Dimension>
74 AverageTemporalDimensionGenericFilter<args_info_type>::UpdateWithDim(const std::string PixelType, const int Components)
76 if (m_Verbose) std::cout << "Image was detected to be "<<Dimension<<"D with "<<Components<<" component(s) of "<< PixelType<<"..."<<std::endl;
79 if(PixelType == "short") {
80 if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and signed short..." << std::endl;
81 UpdateWithDimAndPixelType<Dimension, signed short>();
83 // else if(PixelType == "unsigned_short"){
84 // if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and unsigned_short..." << std::endl;
85 // UpdateWithDimAndPixelType<Dimension, unsigned short>();
88 else if (PixelType == "unsigned_char") {
89 if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and unsigned_char..." << std::endl;
90 UpdateWithDimAndPixelType<Dimension, unsigned char>();
93 // else if (PixelType == "char"){
94 // if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and signed_char..." << std::endl;
95 // UpdateWithDimAndPixelType<Dimension, signed char>();
98 if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and float..." << std::endl;
99 UpdateWithDimAndPixelType<Dimension, float>();
103 // else if (Components==2)
105 // if (m_Verbose) std::cout << "Launching transform in "<< Dimension <<"D and 3D float (DVF)" << std::endl;
106 // UpdateWithDimAndPixelType<Dimension, itk::Vector<float, 2> >();
109 else if (Components==3) {
110 if (m_Verbose) std::cout << "Launching transform in "<< Dimension <<"D and 3D float (DVF)" << std::endl;
111 UpdateWithDimAndPixelType<Dimension, itk::Vector<float, 3> >();
114 // else if (Components==4)
116 // if (m_Verbose) std::cout << "Launching transform in "<< Dimension <<"D and 3D float (DVF)" << std::endl;
117 // UpdateWithDimAndPixelType<Dimension, itk::Vector<float, 3> >();
119 else std::cerr<<"Number of components is "<<Components<<", not supported!"<<std::endl;
123 //-------------------------------------------------------------------
124 // Update with the number of dimensions and the pixeltype
125 //-------------------------------------------------------------------
126 template<class args_info_type>
127 template <unsigned int Dimension, class PixelType>
129 AverageTemporalDimensionGenericFilter<args_info_type>::UpdateWithDimAndPixelType()
133 typedef itk::Image<PixelType, Dimension> InputImageType;
134 typedef itk::Image<PixelType, Dimension-1> OutputImageType;
135 typename InputImageType::Pointer input;
137 if (m_ArgsInfo.input_given ==1 ) {
139 typedef itk::ImageFileReader<InputImageType> InputReaderType;
140 typename InputReaderType::Pointer reader = InputReaderType::New();
141 reader->SetFileName( m_InputFileName);
143 input= reader->GetOutput();
147 // Read and join multiple inputs
148 if (m_Verbose) std::cout<<m_ArgsInfo.input_given<<" inputs given..."<<std::endl;
149 std::vector<std::string> filenames;
150 for(unsigned int i=0; i<m_ArgsInfo.input_given; i++) {
151 if (m_Verbose) std::cout<<m_ArgsInfo.input_arg[i]<<std::endl;
152 filenames.push_back(m_ArgsInfo.input_arg[i]);
155 typedef itk::ImageSeriesReader<InputImageType> ImageReaderType;
156 typename ImageReaderType::Pointer reader= ImageReaderType::New();
157 reader->SetFileNames(filenames);
159 input =reader->GetOutput();
164 typename OutputImageType::RegionType region;
165 typename OutputImageType::RegionType::SizeType size;
166 typename OutputImageType::IndexType index;
167 typename OutputImageType::SpacingType spacing;
168 typename OutputImageType::PointType origin;
169 typename InputImageType::RegionType region4D=input->GetLargestPossibleRegion();
170 typename InputImageType::RegionType::SizeType size4D=region4D.GetSize();
171 typename InputImageType::IndexType index4D=region4D.GetIndex();
172 typename InputImageType::SpacingType spacing4D=input->GetSpacing();
173 typename InputImageType::PointType origin4D=input->GetOrigin();
175 for (unsigned int i=0; i< Dimension-1; i++) {
178 spacing[i]=spacing4D[i];
179 origin[i]=origin4D[i];
181 region.SetSize(size);
182 region.SetIndex(index);
183 typename OutputImageType::Pointer output= OutputImageType::New();
184 output->SetRegions(region);
185 output->SetSpacing(spacing);
186 output->SetOrigin(origin);
191 typedef itk::ImageRegionIterator<InputImageType> IteratorType;
192 std::vector<IteratorType> iterators(size4D[Dimension-1]);
193 for (unsigned int i=0; i< size4D[Dimension-1]; i++) {
194 typename InputImageType::RegionType regionIt=region4D;
195 typename InputImageType::RegionType::SizeType sizeIt=regionIt.GetSize();
196 sizeIt[Dimension-1]=1;
197 regionIt.SetSize(sizeIt);
198 typename InputImageType::IndexType indexIt=regionIt.GetIndex();
199 indexIt[Dimension-1]=i;
200 regionIt.SetIndex(indexIt);
201 iterators[i]=IteratorType(input, regionIt);
204 typedef itk::ImageRegionIterator<OutputImageType> OutputIteratorType;
205 OutputIteratorType avIt(output, output->GetLargestPossibleRegion());
209 PixelType zeroVector=itk::NumericTraits<PixelType>::Zero;
210 //zeroVector.Fill(0.0);
211 while (!(iterators[0]).IsAtEnd()) {
213 for (unsigned int i=0; i<size4D[Dimension-1]; i++) {
214 vector+=iterators[i].Get();
217 vector/=size4D[Dimension-1];
223 typedef itk::ImageFileWriter<OutputImageType> WriterType;
224 typename WriterType::Pointer writer = WriterType::New();
225 writer->SetFileName(m_ArgsInfo.output_arg);
226 writer->SetInput(output);
234 #endif //#define clitkAverageTemporalDimensionGenericFilter_txx