]> Creatis software - clitk.git/commitdiff
Allow to combine multiple elastix transfo
authorDavid Sarrut <david.sarrut@gmail.com>
Fri, 3 Feb 2012 06:57:12 +0000 (07:57 +0100)
committerDavid Sarrut <david.sarrut@creatis.insa-lyon.fr>
Mon, 3 Jun 2013 11:43:31 +0000 (13:43 +0200)
tools/clitkAffineTransform.ggo
tools/clitkAffineTransformGenericFilter.h
tools/clitkAffineTransformGenericFilter.txx

index dc64bffbb9c1df25d36d2c43beb062825aef317b..3cc4eae503b299a8d23e820340870928159a76c2 100644 (file)
@@ -18,7 +18,7 @@ option "spacing"      -       "New output spacing if different from input"    double  no      mul
 option "spacinglike"   -       "New output spacing like this image"            string  no
 option "origin"                -       "New output origin if different from input"     double  no      multiple
 option "matrix"                m       "Affine matrix (homogene) filename"             string  no
-option "elastix"       e       "Read EulerTransform from elastix output file"  string  no
+option "elastix"       e       "Read EulerTransform from elastix output file (combine if multiple)"    string  no      multiple
 option "rotate"                r       "Rotation to apply (radians)"                   double  no      multiple
 option "translate"     t       "Translation to apply (mm)"                     double  no      multiple
 option "pad"           -       "Edge padding value"                            double  no      default="0.0"
index f990fa585cd920e54a95c2b1d2dd3a9c9389726c..6cd2a91f17127ac6c3e3195440a319046100324c 100644 (file)
@@ -105,7 +105,7 @@ namespace clitk
 
     template<unsigned int Dimension, class PixelType>
       typename itk::Matrix<double, Dimension+1, Dimension+1>
-      createMatrixFromElastixFile(std::string filename);
+      createMatrixFromElastixFile(std::vector<std::string> & filename);
 
     bool GetElastixValueFromTag(std::ifstream & is, std::string tag, std::string & value); 
     void GetValuesFromValue(const std::string & s, 
index b2d7a534aa7e250b2d51a4300ebc144fe88669dd..68532a66ffa950e0eb4d7537e09df67e0cd21ffb 100644 (file)
@@ -52,12 +52,12 @@ namespace clitk
     // Call UpdateWithDim
     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 4  Dimensions!!!"<<std::endl ;
-      return;
-    }
+      if(Dimension==3) UpdateWithDim<3>(PixelType, Components);
+      else if (Dimension==4)UpdateWithDim<4>(PixelType, Components);
+      else {
+        std::cout<<"Error, Only for 2, 3 or 4  Dimensions!!!"<<std::endl ;
+        return;
+      }
   }
   //-------------------------------------------------------------------
  
@@ -77,10 +77,10 @@ namespace clitk
         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_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;
@@ -181,7 +181,9 @@ namespace clitk
           }
         else {
           if (m_ArgsInfo.elastix_given) {
-            matrix = createMatrixFromElastixFile<Dimension,PixelType>(m_ArgsInfo.elastix_arg);
+            std::vector<std::string> s;
+            for(uint i=0; i<m_ArgsInfo.elastix_given; i++) s.push_back(m_ArgsInfo.elastix_arg[i]);
+            matrix = createMatrixFromElastixFile<Dimension,PixelType>(s);
           }
           else 
             matrix.SetIdentity();
@@ -495,64 +497,81 @@ namespace clitk
   template<class args_info_type>
   template<unsigned int Dimension, class PixelType>
   typename itk::Matrix<double, Dimension+1, Dimension+1>
-   AffineTransformGenericFilter<args_info_type>::createMatrixFromElastixFile(std::string filename)
+  AffineTransformGenericFilter<args_info_type>::createMatrixFromElastixFile(std::vector<std::string> & filename)
   {
     if (Dimension != 3) {
       FATAL("Only 3D yet" << std::endl);
     }
     typename itk::Matrix<double, Dimension+1, Dimension+1> matrix;
 
-    // Open file
-    std::ifstream is;
-    clitk::openFileForReading(is, filename);
-
-    // Check Transform
-    std::string s; 
-    bool b = GetElastixValueFromTag(is, "Transform ", s);
-    if (!b) {
-      FATAL("Error must read 'Transform' in " << filename << std::endl);
-    }
-    if (s != "EulerTransform") {
-      FATAL("Sorry only 'EulerTransform'" << std::endl);
-    }
-
-    // FIXME check
-    //    (InitialTransformParametersFileName "NoInitialTransform")
-
-    // Get CenterOfRotationPoint
-    GetElastixValueFromTag(is, "CenterOfRotationPoint ", s); // space is needed
-    if (!b) {
-      FATAL("Error must read 'CenterOfRotationPoint' in " << filename << std::endl);
-    }
-    std::vector<std::string> cor; 
-    GetValuesFromValue(s, cor);
-
-    // Get Transformparameters
-    GetElastixValueFromTag(is, "TransformParameters ", s); // space is needed
-    if (!b) {
-      FATAL("Error must read 'TransformParameters' in " << filename << std::endl);
-    }
-    std::vector<std::string> results; 
-    GetValuesFromValue(s, results);
-    
-    // construct a stream from the string
     itk::CenteredEuler3DTransform<double>::Pointer mat = itk::CenteredEuler3DTransform<double>::New();
-    itk::CenteredEuler3DTransform<double>::ParametersType p;
-    p.SetSize(9);
-    for(uint i=0; i<3; i++)
-      p[i] = atof(results[i].c_str()); // Rotation
-    for(uint i=0; i<3; i++)
-      p[i+3] = atof(cor[i].c_str()); // Centre of rotation
-    for(uint i=0; i<3; i++)
-      p[i+6] = atof(results[i+3].c_str()); // Translation
-    mat->SetParameters(p);
+    itk::CenteredEuler3DTransform<double>::Pointer previous;
+    for(uint j=0; j<filename.size(); j++) {
+      
+      // Open file
+      if (m_Verbose) std::cout << "Read elastix parameters in " << filename[j] << std::endl;
+      std::ifstream is;
+      clitk::openFileForReading(is, filename[j]);
+      
+      // Check Transform
+      std::string s; 
+      bool b = GetElastixValueFromTag(is, "Transform ", s);
+      if (!b) {
+        FATAL("Error must read 'Transform' in " << filename[j] << std::endl);
+      }
+      if (s != "EulerTransform") {
+        FATAL("Sorry only 'EulerTransform'" << std::endl);
+      }
+      
+      // FIXME check
+      //    (InitialTransformParametersFilename[j] "NoInitialTransform")
+      
+      // Get CenterOfRotationPoint
+      GetElastixValueFromTag(is, "CenterOfRotationPoint ", s); // space is needed
+      if (!b) {
+        FATAL("Error must read 'CenterOfRotationPoint' in " << filename[j] << std::endl);
+      }
+      std::vector<std::string> cor; 
+      GetValuesFromValue(s, cor);
+      
+      // Get Transformparameters
+      GetElastixValueFromTag(is, "TransformParameters ", s); // space is needed
+      if (!b) {
+        FATAL("Error must read 'TransformParameters' in " << filename[j] << std::endl);
+      }
+      std::vector<std::string> results; 
+      GetValuesFromValue(s, results);
+      
+      // construct a stream from the string
+      itk::CenteredEuler3DTransform<double>::ParametersType p;
+      p.SetSize(9);
+      for(uint i=0; i<3; i++)
+        p[i] = atof(results[i].c_str()); // Rotation
+      for(uint i=0; i<3; i++)
+        p[i+3] = atof(cor[i].c_str()); // Centre of rotation
+      for(uint i=0; i<3; i++)
+        p[i+6] = atof(results[i+3].c_str()); // Translation
+      mat->SetParameters(p);
     
-    if (m_Verbose) {
-      std::cout << "Rotation      (deg) : " << rad2deg(p[0]) << " " << rad2deg(p[1]) << " " << rad2deg(p[2]) << std::endl;
-      std::cout << "Translation   (phy) : " << p[3] << " " << p[4] << " " << p[5] << std::endl;
-      std::cout << "Center of rot (phy) : " << p[6] << " " << p[7] << " " << p[8] << std::endl;
+      if (m_Verbose) {
+        std::cout << "Rotation      (deg) : " << rad2deg(p[0]) << " " << rad2deg(p[1]) << " " << rad2deg(p[2]) << std::endl;
+        std::cout << "Center of rot (phy) : " << p[3] << " " << p[4] << " " << p[5] << std::endl;
+        std::cout << "Translation   (phy) : " << p[6] << " " << p[7] << " " << p[8] << std::endl;
+      }
+
+      // Compose with previous if needed
+      if (j!=0) {
+        mat->Compose(previous);
+        if (m_Verbose) {
+          std::cout << "Composed rotation      (deg) : " << rad2deg(mat->GetAngleX()) << " " << rad2deg(mat->GetAngleY()) << " " << rad2deg(mat->GetAngleZ()) << std::endl;
+          std::cout << "Composed center of rot (phy) : " << mat->GetCenter() << std::endl;
+          std::cout << "Compsoed translation   (phy) : " << mat->GetTranslation() << std::endl;
+      }
+      }
+      previous = mat->Clone();
     }
 
+    mat = previous;
     for(uint i=0; i<3; i++)
       for(uint j=0; j<3; j++)
         matrix[i][j] = mat->GetMatrix()[i][j];
@@ -582,7 +601,7 @@ namespace clitk
         value.erase (std::remove (value.begin(), value.end(), ')'), value.end());
         return true;
       }
-   }
+    }
     return false;
   }
   //-------------------------------------------------------------------