]> Creatis software - clitk.git/blobdiff - tools/clitkAverageTemporalDimensionGenericFilter.txx
First version of the builder of relpos database
[clitk.git] / tools / clitkAverageTemporalDimensionGenericFilter.txx
index 525f0dd3ebf376b37cff8ef129e03c07803a699d..acfb2383bc0d3085e76bcaf49b0360ad20589396 100644 (file)
+/*=========================================================================
+  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://www.centreleonberard.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 clitkAverageTemporalDimensionGenericFilter_txx
 #define clitkAverageTemporalDimensionGenericFilter_txx
 
 /* =================================================
  * @file   clitkAverageTemporalDimensionGenericFilter.txx
- * @author 
- * @date   
- * 
- * @brief 
- * 
+ * @author
+ * @date
+ *
+ * @brief
+ *
  ===================================================*/
 
 
 namespace clitk
 {
 
-  //-----------------------------------------------------------
-  // Constructor
-  //-----------------------------------------------------------
-  template<class args_info_type>
-  AverageTemporalDimensionGenericFilter<args_info_type>::AverageTemporalDimensionGenericFilter()
-  {
-    m_Verbose=false;
-    m_InputFileName="";
+//-----------------------------------------------------------
+// Constructor
+//-----------------------------------------------------------
+template<class args_info_type>
+AverageTemporalDimensionGenericFilter<args_info_type>::AverageTemporalDimensionGenericFilter()
+{
+  m_Verbose=false;
+  m_InputFileName="";
+}
+
+
+//-----------------------------------------------------------
+// Update
+//-----------------------------------------------------------
+template<class args_info_type>
+void AverageTemporalDimensionGenericFilter<args_info_type>::Update()
+{
+  // Read the Dimension and PixelType
+  int Dimension, Components;
+  std::string PixelType;
+  ReadImageDimensionAndPixelType(m_InputFileName, Dimension, PixelType, Components);
+
+
+  // Call UpdateWithDim
+  if (m_ArgsInfo.input_given>1) Dimension+=1;
+  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 4D!!!"<<std::endl ;
+    return;
+  }
+}
+
+//-------------------------------------------------------------------
+// Update with the number of dimensions
+//-------------------------------------------------------------------
+template<class args_info_type>
+template<unsigned int Dimension>
+void
+AverageTemporalDimensionGenericFilter<args_info_type>::UpdateWithDim(const std::string PixelType, const int Components)
+{
+  if (m_Verbose) std::cout << "Image was detected to be "<<Dimension<<"D with "<<Components<<" component(s) of "<<  PixelType<<"..."<<std::endl;
+
+  if (Components==1) {
+    if(PixelType == "short") {
+      if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and signed short..." << std::endl;
+      UpdateWithDimAndPixelType<Dimension, signed short>();
+    }
+    //    else if(PixelType == "unsigned_short"){
+    //       if (m_Verbose) std::cout  << "Launching filter in "<< Dimension <<"D and unsigned_short..." << std::endl;
+    //       UpdateWithDimAndPixelType<Dimension, unsigned short>();
+    //     }
+
+    else if (PixelType == "unsigned_char") {
+      if (m_Verbose) std::cout  << "Launching filter in "<< Dimension <<"D and unsigned_char..." << std::endl;
+      UpdateWithDimAndPixelType<Dimension, unsigned char>();
+    }
+
+    //     else if (PixelType == "char"){
+    //       if (m_Verbose) std::cout  << "Launching filter in "<< Dimension <<"D and signed_char..." << std::endl;
+    //       UpdateWithDimAndPixelType<Dimension, signed char>();
+    //     }
+    else {
+      if (m_Verbose) std::cout  << "Launching filter in "<< Dimension <<"D and float..." << std::endl;
+      UpdateWithDimAndPixelType<Dimension, float>();
+    }
   }
 
+  //     else if (Components==2)
+  //       {
+  //   if (m_Verbose) std::cout  << "Launching transform in "<< Dimension <<"D and 3D float (DVF)" << std::endl;
+  //   UpdateWithDimAndPixelType<Dimension, itk::Vector<float, 2> >();
+  //       }
 
-  //-----------------------------------------------------------
-  // Update
-  //-----------------------------------------------------------
-  template<class args_info_type>
-  void AverageTemporalDimensionGenericFilter<args_info_type>::Update()
-  {
-    // Read the Dimension and PixelType
-    int Dimension, Components;
-    std::string PixelType;
-    ReadImageDimensionAndPixelType(m_InputFileName, Dimension, PixelType, Components);
-
-    
-    // Call UpdateWithDim
-    if (m_ArgsInfo.input_given>1) Dimension+=1;
-    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 4D!!!"<<std::endl ;
-       return;
-      }
+  else if (Components==3) {
+    if (m_Verbose) std::cout  << "Launching transform in "<< Dimension <<"D and 3D float (DVF)" << std::endl;
+    UpdateWithDimAndPixelType<Dimension, itk::Vector<float, 3> >();
   }
 
-  //-------------------------------------------------------------------
-  // Update with the number of dimensions
-  //-------------------------------------------------------------------
-  template<class args_info_type>
-  template<unsigned int Dimension>
-  void 
-  AverageTemporalDimensionGenericFilter<args_info_type>::UpdateWithDim(const std::string PixelType, const int Components)
-  {
-    if (m_Verbose) std::cout << "Image was detected to be "<<Dimension<<"D with "<<Components<<" component(s) of "<<  PixelType<<"..."<<std::endl;
-
-    if (Components==1)
-      {
-       if(PixelType == "short"){  
-         if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and signed short..." << std::endl;
-         UpdateWithDimAndPixelType<Dimension, signed short>(); 
-       }
-       //    else if(PixelType == "unsigned_short"){  
-       //       if (m_Verbose) std::cout  << "Launching filter in "<< Dimension <<"D and unsigned_short..." << std::endl;
-       //       UpdateWithDimAndPixelType<Dimension, unsigned short>(); 
-       //     }
-       
-       else if (PixelType == "unsigned_char"){ 
-         if (m_Verbose) std::cout  << "Launching filter in "<< Dimension <<"D and unsigned_char..." << std::endl;
-         UpdateWithDimAndPixelType<Dimension, unsigned char>();
-       }
-       
-       //     else if (PixelType == "char"){ 
-       //       if (m_Verbose) std::cout  << "Launching filter in "<< Dimension <<"D and signed_char..." << std::endl;
-       //       UpdateWithDimAndPixelType<Dimension, signed char>();
-       //     }
-       else {
-         if (m_Verbose) std::cout  << "Launching filter in "<< Dimension <<"D and float..." << std::endl;
-         UpdateWithDimAndPixelType<Dimension, float>();
-       }
-      }
-
-    //     else if (Components==2)
-    //       {
-    //         if (m_Verbose) std::cout  << "Launching transform in "<< Dimension <<"D and 3D float (DVF)" << std::endl;
-    //         UpdateWithDimAndPixelType<Dimension, itk::Vector<float, 2> >();
-    //       }
-    
-    else if (Components==3)
-      {
-       if (m_Verbose) std::cout  << "Launching transform in "<< Dimension <<"D and 3D float (DVF)" << std::endl;
-       UpdateWithDimAndPixelType<Dimension, itk::Vector<float, 3> >();
-      }
-    
-    //     else if (Components==4)
-    //       {
-    //         if (m_Verbose) std::cout  << "Launching transform in "<< Dimension <<"D and 3D float (DVF)" << std::endl;
-    //         UpdateWithDimAndPixelType<Dimension, itk::Vector<float, 3> >();
-    //       }
-    else std::cerr<<"Number of components is "<<Components<<", not supported!"<<std::endl;
+  //     else if (Components==4)
+  //       {
+  //   if (m_Verbose) std::cout  << "Launching transform in "<< Dimension <<"D and 3D float (DVF)" << std::endl;
+  //   UpdateWithDimAndPixelType<Dimension, itk::Vector<float, 3> >();
+  //       }
+  else std::cerr<<"Number of components is "<<Components<<", not supported!"<<std::endl;
+}
+
+
+//-------------------------------------------------------------------
+// Update with the number of dimensions and the pixeltype
+//-------------------------------------------------------------------
+template<class args_info_type>
+template <unsigned int Dimension, class  PixelType>
+void
+AverageTemporalDimensionGenericFilter<args_info_type>::UpdateWithDimAndPixelType()
+{
+
+  // ImageTypes
+  typedef itk::Image<PixelType, Dimension> InputImageType;
+  typedef itk::Image<PixelType, Dimension-1> OutputImageType;
+  typename InputImageType::Pointer input;
+
+  if (m_ArgsInfo.input_given ==1 ) {
+    // Read the input
+    typedef itk::ImageFileReader<InputImageType> InputReaderType;
+    typename InputReaderType::Pointer reader = InputReaderType::New();
+    reader->SetFileName( m_InputFileName);
+    reader->Update();
+    input= reader->GetOutput();
   }
 
+  else {
+    // Read and join multiple inputs
+    if (m_Verbose) std::cout<<m_ArgsInfo.input_given<<" inputs given..."<<std::endl;
+    std::vector<std::string> filenames;
+    for(unsigned int i=0; i<m_ArgsInfo.input_given; i++) {
+      if (m_Verbose) std::cout<<m_ArgsInfo.input_arg[i]<<std::endl;
+      filenames.push_back(m_ArgsInfo.input_arg[i]);
+    }
+
+    typedef itk::ImageSeriesReader<InputImageType> ImageReaderType;
+    typename  ImageReaderType::Pointer reader= ImageReaderType::New();
+    reader->SetFileNames(filenames);
+    reader->Update();
+    input =reader->GetOutput();
+  }
 
-  //-------------------------------------------------------------------
-  // Update with the number of dimensions and the pixeltype
-  //-------------------------------------------------------------------
-  template<class args_info_type>
-  template <unsigned int Dimension, class  PixelType> 
-  void 
-  AverageTemporalDimensionGenericFilter<args_info_type>::UpdateWithDimAndPixelType()
-  {
-
-    // ImageTypes
-    typedef itk::Image<PixelType, Dimension> InputImageType;
-    typedef itk::Image<PixelType, Dimension-1> OutputImageType;
-    typename InputImageType::Pointer input;
-
-    if (m_ArgsInfo.input_given ==1 )
-      {
-       // Read the input
-       typedef itk::ImageFileReader<InputImageType> InputReaderType;
-       typename InputReaderType::Pointer reader = InputReaderType::New();
-       reader->SetFileName( m_InputFileName);
-       reader->Update();
-       input= reader->GetOutput();
-      }
-
-    else 
-      {
-       // Read and join multiple inputs
-       if (m_Verbose) std::cout<<m_ArgsInfo.input_given<<" inputs given..."<<std::endl;
-       std::vector<std::string> filenames;
-       for(unsigned int i=0; i<m_ArgsInfo.input_given;i++)
-         {
-           if (m_Verbose) std::cout<<m_ArgsInfo.input_arg[i]<<std::endl;
-           filenames.push_back(m_ArgsInfo.input_arg[i]);
-         }
-       
-       typedef itk::ImageSeriesReader<InputImageType> ImageReaderType;
-       typename  ImageReaderType::Pointer reader= ImageReaderType::New();
-       reader->SetFileNames(filenames);
-       reader->Update();
-       input =reader->GetOutput();
-      }
-
-    
-    // Output properties
-    typename OutputImageType::RegionType region;
-    typename OutputImageType::RegionType::SizeType size;
-    typename OutputImageType::IndexType index;
-    typename OutputImageType::SpacingType spacing;
-    typename OutputImageType::PointType origin;
-    typename InputImageType::RegionType region4D=input->GetLargestPossibleRegion();
-    typename InputImageType::RegionType::SizeType size4D=region4D.GetSize();
-    typename InputImageType::IndexType index4D=region4D.GetIndex();
-    typename InputImageType::SpacingType spacing4D=input->GetSpacing();
-    typename InputImageType::PointType origin4D=input->GetOrigin();
-
-    for (unsigned int i=0; i< Dimension-1; i++)
-      {
-       size[i]=size4D[i];
-       index[i]=index4D[i];
-       spacing[i]=spacing4D[i];
-       origin[i]=origin4D[i];
-      }
-    region.SetSize(size);
-    region.SetIndex(index);
-    typename OutputImageType::Pointer output= OutputImageType::New();
-    output->SetRegions(region);
-    output->SetSpacing(spacing);
-    output->SetOrigin(origin);
-    output->Allocate();
-
-
-    // Region iterators
-    typedef itk::ImageRegionIterator<InputImageType> IteratorType;
-    std::vector<IteratorType> iterators(size4D[Dimension-1]);
-    for (unsigned int i=0; i< size4D[Dimension-1]; i++)
-      {
-        typename InputImageType::RegionType regionIt=region4D;
-        typename InputImageType::RegionType::SizeType sizeIt=regionIt.GetSize();
-       sizeIt[Dimension-1]=1;
-        regionIt.SetSize(sizeIt);
-        typename InputImageType::IndexType indexIt=regionIt.GetIndex();
-       indexIt[Dimension-1]=i;
-       regionIt.SetIndex(indexIt);
-       iterators[i]=IteratorType(input, regionIt);
-       }
-
-    typedef itk::ImageRegionIterator<OutputImageType> OutputIteratorType;
-    OutputIteratorType avIt(output, output->GetLargestPossibleRegion());
-
-    // Average
-    PixelType vector;
-    PixelType zeroVector=itk::NumericTraits<PixelType>::Zero;
-    //zeroVector.Fill(0.0);
-    while (!(iterators[0]).IsAtEnd())
-      {
-       vector=zeroVector;
-       for (unsigned int i=0; i<size4D[Dimension-1]; i++)
-         {
-           vector+=iterators[i].Get();
-           ++(iterators[i]);
-         }
-       vector/=size4D[Dimension-1];
-       avIt.Set(vector);
-       ++avIt;
-      }
-    
-    // Output
-    typedef itk::ImageFileWriter<OutputImageType> WriterType;
-    typename WriterType::Pointer writer = WriterType::New();
-    writer->SetFileName(m_ArgsInfo.output_arg);
-    writer->SetInput(output);
-    writer->Update();
 
+  // Output properties
+  typename OutputImageType::RegionType region;
+  typename OutputImageType::RegionType::SizeType size;
+  typename OutputImageType::IndexType index;
+  typename OutputImageType::SpacingType spacing;
+  typename OutputImageType::PointType origin;
+  typename InputImageType::RegionType region4D=input->GetLargestPossibleRegion();
+  typename InputImageType::RegionType::SizeType size4D=region4D.GetSize();
+  typename InputImageType::IndexType index4D=region4D.GetIndex();
+  typename InputImageType::SpacingType spacing4D=input->GetSpacing();
+  typename InputImageType::PointType origin4D=input->GetOrigin();
+
+  for (unsigned int i=0; i< Dimension-1; i++) {
+    size[i]=size4D[i];
+    index[i]=index4D[i];
+    spacing[i]=spacing4D[i];
+    origin[i]=origin4D[i];
+  }
+  region.SetSize(size);
+  region.SetIndex(index);
+  typename OutputImageType::Pointer output= OutputImageType::New();
+  output->SetRegions(region);
+  output->SetSpacing(spacing);
+  output->SetOrigin(origin);
+  output->Allocate();
+
+
+  // Region iterators
+  typedef itk::ImageRegionIterator<InputImageType> IteratorType;
+  std::vector<IteratorType> iterators(size4D[Dimension-1]);
+  for (unsigned int i=0; i< size4D[Dimension-1]; i++) {
+    typename InputImageType::RegionType regionIt=region4D;
+    typename InputImageType::RegionType::SizeType sizeIt=regionIt.GetSize();
+    sizeIt[Dimension-1]=1;
+    regionIt.SetSize(sizeIt);
+    typename InputImageType::IndexType indexIt=regionIt.GetIndex();
+    indexIt[Dimension-1]=i;
+    regionIt.SetIndex(indexIt);
+    iterators[i]=IteratorType(input, regionIt);
   }
 
+  typedef itk::ImageRegionIterator<OutputImageType> OutputIteratorType;
+  OutputIteratorType avIt(output, output->GetLargestPossibleRegion());
+
+  // Average
+  PixelType vector;
+  PixelType zeroVector=itk::NumericTraits<PixelType>::Zero;
+  //zeroVector.Fill(0.0);
+  while (!(iterators[0]).IsAtEnd()) {
+    vector=zeroVector;
+    for (unsigned int i=0; i<size4D[Dimension-1]; i++) {
+      vector+=iterators[i].Get();
+      ++(iterators[i]);
+    }
+    vector/=size4D[Dimension-1];
+    avIt.Set(vector);
+    ++avIt;
+  }
+
+  // Output
+  typedef itk::ImageFileWriter<OutputImageType> WriterType;
+  typename WriterType::Pointer writer = WriterType::New();
+  writer->SetFileName(m_ArgsInfo.output_arg);
+  writer->SetInput(output);
+  writer->Update();
+
+}
+
 
 }//end clitk
+
 #endif //#define clitkAverageTemporalDimensionGenericFilter_txx