]> Creatis software - clitk.git/blobdiff - tools/clitkImageExtractLine.cxx
Order stations, remove debug, correct structures names
[clitk.git] / tools / clitkImageExtractLine.cxx
index bd7c97816e4a5e6fa1292b5832ce3af96bb16fc6..3d59bf57882f0f502a0d05fe3a065c12d789fe29 100644 (file)
@@ -3,7 +3,7 @@
 
   Authors belong to:
   - University of LYON              http://www.universite-lyon.fr/
-  - Léon Bérard cancer center       http://oncora1.lyon.fnclcc.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
@@ -14,7 +14,7 @@
 
   - BSD        See included LICENSE.txt file
   - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
-======================================================================-====*/
+===========================================================================**/
 #ifndef CLITKIMAGEEXTRACTLINE_CXX
 #define CLITKIMAGEEXTRACTLINE_CXX
 /**
    * @file   clitkImageExtractLine.cxx
    * @author David Sarrut <David.Sarrut@creatis.insa-lyon.fr>
    * @date   23 Feb 2008 08:37:53
+   * @modified by Loïc Grevillot <Loic.Grevillot@creatis.insa-lyon.fr>
+   * @date   10 March 2011
+      * Option -I added, in order to integrate plans perpendicular to a line
+   
    -------------------------------------------------*/
 
 // clitk include
@@ -43,6 +47,7 @@ int main(int argc, char * argv[])
   typedef float PixelType;
   const unsigned int Dimension=3;
   typedef itk::Image<PixelType, Dimension> ImageType;
+  typedef itk::Size<Dimension> SizeType;
 
   // Check options
   if (args_info.firstIndex_given != Dimension) {
@@ -75,16 +80,100 @@ int main(int argc, char * argv[])
   length = sqrt(length);
 
   // Loop
+//   std::vector<double> depth;
+//   std::vector<double> values;
+//   itk::LineConstIterator<ImageType> iter(input, firstIndex, lastIndex);
+//   iter.GoToBegin();
+//   while (!iter.IsAtEnd()) {
+//     values.push_back(iter.Get());
+//     ++iter;
+//   }
+//   double step = length/values.size();
+
   std::vector<double> depth;
   std::vector<double> values;
   itk::LineConstIterator<ImageType> iter(input, firstIndex, lastIndex);
-  iter.GoToBegin();
-  while (!iter.IsAtEnd()) {
-    values.push_back(iter.Get());
-    ++iter;
+  int direction=0;
+  
+  // args_info.integral_arg=0, so, it does not compute the integral
+  if (args_info.integral_arg==0){
+    iter.GoToBegin();
+    while (!iter.IsAtEnd()) {
+      values.push_back(iter.Get());
+      ++iter;
+    }
+  }
+  // args_info.integral_arg=1, so, it computes the integral
+  if (args_info.integral_arg!=0){
+    int a=0, b=0, c=0;
+    if (args_info.integralAxis_arg==0){
+       a=1;
+       b=0;
+       c=2;
+    }
+    else if (args_info.integralAxis_arg==1){
+       a=0;
+       b=1;
+       c=2;
+    }
+    else if (args_info.integralAxis_arg==2){
+       a=2;
+       b=0;
+       c=1;
+    }
+    else {std::cout<<"Wrong axis"<<std::endl;
+      exit(0);
+    }
+  
+  length=(lastIndex[b]-firstIndex[b])*spacing[b];
+  
+  std::cout<<"The line is extracted along axis "<<args_info.integralAxis_arg<<std::endl;
+  std::cout<<"The line is integrated between "<<args_info.firstIndex_arg[a]<<" and "<<args_info.lastIndex_arg[a]<<" along axis "<<a<<std::endl;
+  std::cout<<"The line is integrated between "<<args_info.firstIndex_arg[c]<<" and "<<args_info.lastIndex_arg[c]<<" along axis "<<c<<std::endl;
+  
+      SizeType dim;
+      dim=input->GetLargestPossibleRegion().GetSize();
+      DD(dim);
+      DD(direction);
+      
+      std::vector<double> val(dim[b]);
+       for (size_t i=0; i<dim[b]; i++)
+         val[i]=0;
+       
+      int k;
+       
+      for (int i=args_info.firstIndex_arg[a]; i<args_info.lastIndex_arg[a]; i++){
+       for (int j=args_info.firstIndex_arg[c]; j<args_info.lastIndex_arg[c]; j++){
+    //      std::cout<<"i "<<i<<"  j "<<j<<std::endl;
+         k=0;
+         firstIndex[a]=i;
+         firstIndex[c]=j;
+         lastIndex[a]=i;
+         lastIndex[c]=j;
+    //      std::cout<<"A"<<std::endl;
+         itk::LineConstIterator<ImageType> iter(input, firstIndex, lastIndex);
+         iter.GoToBegin();
+    //      std::cout<<"B"<<std::endl;
+         val[k]+=iter.Get();
+         k++;
+    //      std::cout<<"C"<<std::endl;
+         while (!iter.IsAtEnd()) {
+    // std::cout<<"D "<<k<<std::endl;
+           val[k]+=iter.Get();
+           ++iter;
+           k++;
+         }
+       }
+      }
+  
+      for (unsigned int i=0; i<dim[b]; i++){
+       values.push_back(val[i]);
+      }
   }
+  
   double step = length/values.size();
-
+  DD(values.size());
+  
   // If isocenter is used
   double isoDistance = 0.0;
   if (args_info.isocenter_given) { // isoCenter is in mm