[pubgit-commits-list] Clitk branch master updated. v1.2.0-623-g75d074a

root root at tux.creatis.insa-lyon.fr
Thu Jan 19 17:40:44 CET 2012


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Clitk".

The branch, master has been updated
       via  75d074a4caf86e1c036bc7879557a1600ad0ceac (commit)
      from  0ebe428ddf5c84373c3eb814e9465f048b1e7d48 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://git.creatis.insa-lyon.fr/pubgit/?p=clitk.git;a=commitdiff;h=75d074a4caf86e1c036bc7879557a1600ad0ceac

commit 75d074a4caf86e1c036bc7879557a1600ad0ceac
Author: Romulo Pinho <romulo.pinho at lyon.unicancer.fr>
Date:   Thu Jan 19 17:39:42 2012 +0100

    image warping using B-Spline coefficients
    
    - uses the resolution of the input image for the output

diff --git a/tools/clitkWarpImage.cxx b/tools/clitkWarpImage.cxx
index 3360661..673a583 100644
--- a/tools/clitkWarpImage.cxx
+++ b/tools/clitkWarpImage.cxx
@@ -40,6 +40,13 @@ int main(int argc, char * argv[])
   GGO(clitkWarpImage, args_info);
   CLITK_INIT;
 
+  if (args_info.coeff_given) {
+    if (args_info.verbose_flag)
+      std::cout<< "Using coefficient images, so forcing sapcing = 1.\n" << std::endl;
+    
+    args_info.spacing_arg = 1;
+  }
+
   // Filter
   clitk::WarpImageGenericFilter::Pointer genericFilter=clitk::WarpImageGenericFilter::New();
 
diff --git a/tools/clitkWarpImage.ggo b/tools/clitkWarpImage.ggo
index 8a572c4..12aa18e 100644
--- a/tools/clitkWarpImage.ggo
+++ b/tools/clitkWarpImage.ggo
@@ -10,7 +10,10 @@ section "I/O"
 
 option "input"		i	"Input image filename"		  string  	yes
 option "output"    	o   	"Output image filename"		  string 	yes
-option "vf"		-	"Vector field filename"		  string 		yes
+
+defgroup "DVFoption" groupdesc="an option of this group is required" required
+groupoption "vf"		-	"Vector field filename"		  string 		yes group="DVFoption"
+groupoption "coeff"   - "B-Spline coefficients filename"     string    yes group="DVFoption"
 
 
 section "Options"
diff --git a/tools/clitkWarpImageGenericFilter.h b/tools/clitkWarpImageGenericFilter.h
index 93eda73..9394d8d 100644
--- a/tools/clitkWarpImageGenericFilter.h
+++ b/tools/clitkWarpImageGenericFilter.h
@@ -98,7 +98,7 @@ namespace clitk
     //----------------------------------------  
     template <unsigned int Dimension>  void UpdateWithDim(std::string PixelType);
     template <unsigned int Dimension, class PixelType>  void UpdateWithDimAndPixelType();
-
+    template<class DisplacementFieldType> typename DisplacementFieldType::Pointer CoeffsToDVF(std::string fileName, std::string likeFileName);
 
     //----------------------------------------  
     // Data members
diff --git a/tools/clitkWarpImageGenericFilter.txx b/tools/clitkWarpImageGenericFilter.txx
index 8544df2..ce979aa 100644
--- a/tools/clitkWarpImageGenericFilter.txx
+++ b/tools/clitkWarpImageGenericFilter.txx
@@ -27,6 +27,13 @@
  *
  ===================================================*/
 
+#include "itkVectorResampleImageFilter.h"
+#include "clitkBSplineDeformableTransform.h"
+#if ITK_VERSION_MAJOR >= 4
+#include "itkTransformToDisplacementFieldSource.h"
+#else
+#include "itkTransformToDeformationFieldSource.h"
+#endif
 
 namespace clitk
 {
@@ -64,6 +71,63 @@ WarpImageGenericFilter::UpdateWithDim(std::string PixelType)
   }
 }
 
+//-------------------------------------------------------------------
+// Convert Coefficient image to DVF
+//-------------------------------------------------------------------
+template<class DisplacementFieldType>
+typename DisplacementFieldType::Pointer
+WarpImageGenericFilter::CoeffsToDVF(std::string fileName, std::string likeFileName)
+{
+  typedef clitk::BSplineDeformableTransform<double, DisplacementFieldType::ImageDimension, DisplacementFieldType::ImageDimension> TransformType;
+  typedef typename TransformType::CoefficientImageType CoefficientImageType;
+
+  typedef itk::ImageFileReader<CoefficientImageType> CoeffReaderType;
+  typename CoeffReaderType::Pointer reader = CoeffReaderType::New();
+  reader->SetFileName(fileName);
+  reader->Update();
+
+  typename TransformType::Pointer transform = TransformType::New();
+  transform->SetCoefficientImage(reader->GetOutput());
+  
+#if ITK_VERSION_MAJOR >= 4
+      typedef itk::TransformToDisplacementFieldSource<DisplacementFieldType, double> ConvertorType;
+#else
+      typedef itk::TransformToDeformationFieldSource<DisplacementFieldType, double> ConvertorType;
+#endif
+
+  typedef itk::ImageIOBase ImageIOType;
+  typename ImageIOType::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(likeFileName.c_str(), itk::ImageIOFactory::ReadMode);
+  imageIO->SetFileName(likeFileName);
+  imageIO->ReadImageInformation();
+
+  typename ConvertorType::Pointer convertor= ConvertorType::New();
+  typename ConvertorType::SizeType output_size;
+  typename ConvertorType::SpacingType output_spacing;
+  typename ConvertorType::OriginType output_origin;
+  typename ConvertorType::DirectionType output_direction;
+  for (unsigned int i = 0; i < DisplacementFieldType::ImageDimension; i++) {
+    output_size[i] = imageIO->GetDimensions(i);
+    output_spacing[i] = imageIO->GetSpacing(i);
+    output_origin[i] = imageIO->GetOrigin(i);
+    for (unsigned int j = 0; j < DisplacementFieldType::ImageDimension; j++)
+      output_direction[i][j] = imageIO->GetDirection(i)[j];
+  }
+  
+  if (m_Verbose) {
+    std::cout << "Interpolating coefficients with grid:" << std::endl;
+    std::cout << output_size << output_spacing << std::endl;
+  }
+  
+  convertor->SetNumberOfThreads(1);
+  convertor->SetTransform(transform);
+  convertor->SetOutputOrigin(output_origin);
+  convertor->SetOutputSpacing(output_spacing);
+  convertor->SetOutputSize(output_size);
+  convertor->SetOutputDirection(output_direction);
+  convertor->Update();
+
+  return convertor->GetOutput();
+}
 
 //-------------------------------------------------------------------
 // Update with the number of dimensions and the pixeltype
@@ -78,21 +142,26 @@ WarpImageGenericFilter::UpdateWithDimAndPixelType()
   typedef itk::Image<PixelType, Dimension> OutputImageType;
   typedef itk::Vector<float, Dimension> DisplacementType;
   typedef itk::Image<DisplacementType, Dimension> DeformationFieldType;
-
-
+  
   // Read the input
   typedef itk::ImageFileReader<InputImageType> InputReaderType;
   typename InputReaderType::Pointer reader = InputReaderType::New();
   reader->SetFileName( m_InputFileName);
   reader->Update();
   typename InputImageType::Pointer input= reader->GetOutput();
-
-  //Read the deformation field
-  typedef itk::ImageFileReader<DeformationFieldType> DeformationFieldReaderType;
-  typename  DeformationFieldReaderType::Pointer deformationFieldReader= DeformationFieldReaderType::New();
-  deformationFieldReader->SetFileName(m_ArgsInfo.vf_arg);
-  deformationFieldReader->Update();
-  typename DeformationFieldType::Pointer deformationField =deformationFieldReader->GetOutput();
+  
+  typename DeformationFieldType::Pointer deformationField;
+  if (m_ArgsInfo.coeff_given) {
+    deformationField = CoeffsToDVF<DeformationFieldType>(m_ArgsInfo.coeff_arg, m_InputFileName);
+  }
+  else {
+    //Read the deformation field
+    typedef itk::ImageFileReader<DeformationFieldType> DeformationFieldReaderType;
+    typename  DeformationFieldReaderType::Pointer deformationFieldReader= DeformationFieldReaderType::New();
+    deformationFieldReader->SetFileName(m_ArgsInfo.vf_arg);
+    deformationFieldReader->Update();
+    deformationField =deformationFieldReader->GetOutput();
+  }
 
   // Intensity interpolator
   typedef clitk::GenericVectorInterpolator<args_info_clitkWarpImage, DeformationFieldType, double> GenericInterpolatorType;
@@ -139,7 +208,7 @@ WarpImageGenericFilter::UpdateWithDimAndPixelType()
   // -------------------------------------------
   // Spacing like input
   // -------------------------------------------
-  else {
+  else if (!m_ArgsInfo.coeff_given) {
     // Get size
     typename DeformationFieldType::SizeType newSize;
     for (unsigned int i=0 ; i <Dimension; i++)

-----------------------------------------------------------------------

Summary of changes:
 tools/clitkWarpImage.cxx              |    7 +++
 tools/clitkWarpImage.ggo              |    5 ++-
 tools/clitkWarpImageGenericFilter.h   |    2 +-
 tools/clitkWarpImageGenericFilter.txx |   89 +++++++++++++++++++++++++++++----
 4 files changed, 91 insertions(+), 12 deletions(-)


hooks/post-receive
-- 
Clitk


More information about the Pubgit-commits-list mailing list