]> Creatis software - clitk.git/blobdiff - tools/clitkAffineTransformGenericFilter.txx
Allow to convert/write uint image (dose from eclipse)
[clitk.git] / tools / clitkAffineTransformGenericFilter.txx
index 621dfd0eae1b1796bf8decefc988ca282650fd07..d3cd19e265a84b411ffd27a0791672502ca1d0d2 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();
@@ -214,7 +216,7 @@ namespace clitk
       typename itk::Matrix<double, Dimension+1, Dimension+1> invMatrix( matrix.GetInverse() );
       typename itk::Matrix<double, Dimension, Dimension> invRotMatrix( clitk::GetRotationalPartMatrix(invMatrix) );
       typename itk::Vector<double,Dimension> invTrans =  clitk::GetTranslationPartMatrix(invMatrix);
-
+      
       // Display warning
       if (m_ArgsInfo.spacing_given)
         std::cout << "Warning --spacing ignored (because --transform_grid_flag)" << std::endl;
@@ -285,6 +287,29 @@ namespace clitk
 
     }
 
+    if (m_ArgsInfo.spacinglike_given) {
+      typename InputReaderType::Pointer likeReader=InputReaderType::New();
+      likeReader->SetFileName(m_ArgsInfo.spacinglike_arg);
+      likeReader->Update(); 
+
+      // set the support like the image 
+      if (m_ArgsInfo.like_given) {
+        typename OutputImageType::SizeType outputSize;
+        outputSize[0] = ceil(resampler->GetSize()[0]*resampler->GetOutputSpacing()[0]
+                             /likeReader->GetOutput()->GetSpacing()[0]);
+        outputSize[1] = ceil(resampler->GetSize()[1]*resampler->GetOutputSpacing()[1]
+                             /likeReader->GetOutput()->GetSpacing()[1]);
+        outputSize[2] = ceil(resampler->GetSize()[2]*resampler->GetOutputSpacing()[2]
+                             /likeReader->GetOutput()->GetSpacing()[2]);
+        if (m_ArgsInfo.verbose_flag) {
+          std::cout << "Compute the number of pixels such as the support is like " << m_ArgsInfo.like_arg << std::endl;
+        }
+        resampler->SetSize( outputSize );
+      }
+
+      resampler->SetOutputSpacing( likeReader->GetOutput()->GetSpacing() );      
+    }
+
     if (m_ArgsInfo.verbose_flag) {
       std::cout << "Setting the output size to " << resampler->GetSize() << "..." << std::endl;
       std::cout << "Setting the output spacing to " << resampler->GetOutputSpacing() << "..." << std::endl;
@@ -472,64 +497,83 @@ 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(); // ITK4
+      previous = itk::CenteredEuler3DTransform<double>::New();
+      previous->SetParameters(mat->GetParameters());
     }
 
+    mat = previous;
     for(uint i=0; i<3; i++)
       for(uint j=0; j<3; j++)
         matrix[i][j] = mat->GetMatrix()[i][j];
@@ -559,7 +603,7 @@ namespace clitk
         value.erase (std::remove (value.begin(), value.end(), ')'), value.end());
         return true;
       }
-   }
+    }
     return false;
   }
   //-------------------------------------------------------------------