]> Creatis software - clitk.git/commitdiff
Merge branch 'master' of /home/dsarrut/clitk3.server
authormpech <maxime.pech@insa-lyon.fr>
Wed, 29 Jun 2011 11:34:41 +0000 (13:34 +0200)
committermpech <maxime.pech@insa-lyon.fr>
Wed, 29 Jun 2011 11:34:41 +0000 (13:34 +0200)
common/clitkImageCommon.h
common/clitkImageCommon.txx
segmentation/clitkMorphoMathFilter.txx
tools/clitkAffineTransformGenericFilter.txx
tools/clitkImageArithmGenericFilter.txx
tools/clitkMakeSphereImage.cxx
vv/vvSlicer.cxx

index 3cd8ae51520d7623bb95e0ccca692e329142684e..fbddb20d3ddabaaba554b0a662c36beba77b0364 100644 (file)
@@ -1,7 +1,7 @@
 /*=========================================================================
   Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
 
-  Authors belong to: 
+  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
 #include "itkImageSeriesReader.h"
 #include "itkImageFileWriter.h"
 
-namespace clitk {
-  
-  //--------------------------------------------------------------------
-  // New Image creation (no allocation)
-  template<class PixelType>
-  typename itk::Image<PixelType,1>::Pointer NewImage1D(int size, double spacing=1.0);
-  template<class PixelType>
-  typename itk::Image<PixelType,2>::Pointer NewImage2D(int sx, int sy, double dx=1.0, double dy=1.0);
-  template<class PixelType>
-  typename itk::Image<PixelType,3>::Pointer NewImage3D(int sx, int sy, int sz, double dx=1.0, double dy=1.0, double dz=1.0);
-  template<class PixelType>
-  typename itk::Image<PixelType,4>::Pointer NewImage4D(int sx, int sy, int sz, int st, double dx=1.0, double dy=1.0, double dz=1.0, double dt=1.0);
-
-  template<class ImageType>
-  typename ImageType::Pointer NewImageLike(const typename ImageType::Pointer input, bool allocate=true);
-
-  template<class ImageType>
-  void CopyValues(const typename ImageType::Pointer input, typename ImageType::Pointer output);
-  //--------------------------------------------------------------------
-  // New Image creation (with allocation)
-
-  //--------------------------------------------------------------------
-  // Read an Write image
-  // template<class ImageType>
-  //   typename ImageType::Pointer ReadImage(const std::string & filename, const bool verbose=false);
-  template<typename ImageType>
-  typename ImageType::Pointer readImage(const std::string & filename, const bool verbose=false);  
-  template<typename ImageType>
-  typename ImageType::Pointer readImage(const std::vector<std::string> & filenames, const bool verbose=false);
-  template<class ImageType>
-  void writeImage(const typename ImageType::Pointer image, const std::string & filename, const bool verbose=false);
-//   template<class ImageType>  
+namespace clitk
+{
+
+//--------------------------------------------------------------------
+// New Image creation (no allocation)
+template<class PixelType>
+typename itk::Image<PixelType,1>::Pointer NewImage1D(int size, double spacing=1.0);
+template<class PixelType>
+typename itk::Image<PixelType,2>::Pointer NewImage2D(int sx, int sy, double dx=1.0, double dy=1.0);
+template<class PixelType>
+typename itk::Image<PixelType,3>::Pointer NewImage3D(int sx, int sy, int sz, double dx=1.0, double dy=1.0, double dz=1.0);
+template<class PixelType>
+typename itk::Image<PixelType,4>::Pointer NewImage4D(int sx, int sy, int sz, int st, double dx=1.0, double dy=1.0, double dz=1.0, double dt=1.0);
+
+template<class ImageType>
+typename ImageType::Pointer NewImageLike(const typename ImageType::Pointer input, bool allocate=true);
+
+template<class ImageType>
+void CopyValues(const typename ImageType::Pointer input, typename ImageType::Pointer output);
+//--------------------------------------------------------------------
+// New Image creation (with allocation)
+
+//--------------------------------------------------------------------
+// Read an Write image
+// template<class ImageType>
+//   typename ImageType::Pointer ReadImage(const std::string & filename, const bool verbose=false);
+template<typename ImageType>
+typename ImageType::Pointer readImage(const std::string & filename, const bool verbose=false);
+template<typename ImageType>
+typename ImageType::Pointer readImage(const std::vector<std::string> & filenames, const bool verbose=false);
+template<class ImageType>
+void writeImage(const typename ImageType::Pointer image, const std::string & filename, const bool verbose=false);
+//   template<class ImageType>
 //   void writeConstImage(const typename ImageType::ConstPointer image, const std::string & filename, const bool verbose=false);
-  template<class ImageType>  
-  void writeImage(const ImageType* image, const std::string & filename, const bool verbose=false);
-
-  //--------------------------------------------------------------------
-  // Read/print image header
-  itk::ImageIOBase::Pointer readImageHeader(const std::string & filename,bool exit_on_error=true);
-  void printImageHeader(itk::ImageIOBase::Pointer header, std::ostream & os, const int level=0);
-
-  //--------------------------------------------------------------------
-  // Determine pixetype and dimension of an image file
-  void ReadImageDimensionAndPixelType(const std::string & filename, int & dimension, std::string & pixeType);
-
-  //--------------------------------------------------------------------
-  // Determine pixetype, dimension and number of pixel components  of an image file
-  void ReadImageDimensionAndPixelType(const std::string & filename, int & dimension, std::string & pixeType, int & components);
-
-  //--------------------------------------------------------------------
-  template<class ImageType>
-  int ComputeHowManyDifferentIntensity(const typename ImageType::Pointer & image, 
-                                      std::vector<typename ImageType::PixelType> & listOfIntensities);
-  template<class InputImageType, class MaskImageType>
-  void ComputeWeightsOfEachClasses(const typename InputImageType::Pointer & input, 
-                                  const typename MaskImageType::Pointer & mask,
-                                  const std::vector<typename MaskImageType::PixelType> & listOfIntensities, 
-                                  std::map<typename MaskImageType::PixelType, 
-                                  std::map<typename InputImageType::PixelType, double> > & mapOfLabelsAndWeights);
-
-  //--------------------------------------------------------------------
-  template<class ImageType1, class ImageType2>
-  bool HaveSameSizeAndSpacing(typename ImageType1::ConstPointer A, 
-                             typename ImageType2::ConstPointer B);
-
-  template<class ImageType1, class ImageType2>
-  bool HaveSameSizeAndSpacing(typename ImageType1::Pointer A, 
-                             typename ImageType2::Pointer B);
-
-  //--------------------------------------------------------------------
-  template<class ImageType1, class ImageType2>
-  bool HaveSameSpacing(typename ImageType1::ConstPointer A, 
-                       typename ImageType2::ConstPointer B);
-
-  template<class ImageType1, class ImageType2>
-  bool HaveSameSpacing(typename ImageType1::Pointer A, 
-                       typename ImageType2::Pointer B);
+template<class ImageType>
+void writeImage(const ImageType* image, const std::string & filename, const bool verbose=false);
+
+//--------------------------------------------------------------------
+// Read/print image header
+itk::ImageIOBase::Pointer readImageHeader(const std::string & filename,bool exit_on_error=true);
+void printImageHeader(itk::ImageIOBase::Pointer header, std::ostream & os, const int level=0);
+
+//--------------------------------------------------------------------
+// Determine pixetype and dimension of an image file
+void ReadImageDimensionAndPixelType(const std::string & filename, int & dimension, std::string & pixeType);
+
+//--------------------------------------------------------------------
+// Determine pixetype, dimension and number of pixel components  of an image file
+void ReadImageDimensionAndPixelType(const std::string & filename, int & dimension, std::string & pixeType, int & components);
+
+//--------------------------------------------------------------------
+template<class ImageType>
+int ComputeHowManyDifferentIntensity(const typename ImageType::Pointer & image,
+                                     std::vector<typename ImageType::PixelType> & listOfIntensities);
+template<class InputImageType, class MaskImageType>
+void ComputeWeightsOfEachClasses(const typename InputImageType::Pointer & input,
+                                 const typename MaskImageType::Pointer & mask,
+                                 const std::vector<typename MaskImageType::PixelType> & listOfIntensities,
+                                 std::map<typename MaskImageType::PixelType,
+                                 std::map<typename InputImageType::PixelType, double> > & mapOfLabelsAndWeights);
+
+//--------------------------------------------------------------------
+template<class ImageType1, class ImageType2>
+bool HaveSameSpacing(typename ImageType1::ConstPointer A,
+                     typename ImageType2::ConstPointer B);
+
+template<class ImageType1, class ImageType2>
+bool HaveSameSpacing(typename ImageType1::Pointer A,
+                     typename ImageType2::Pointer B);
+
+//--------------------------------------------------------------------
+template<class ImageType1, class ImageType2>
+bool HaveSameSize(typename ImageType1::ConstPointer A,
+                  typename ImageType2::ConstPointer B);
+
+template<class ImageType1, class ImageType2>
+bool HaveSameSize(typename ImageType1::Pointer A,
+                  typename ImageType2::Pointer B);
+
+//--------------------------------------------------------------------
+template<class ImageType1, class ImageType2>
+bool HaveSameSizeAndSpacing(typename ImageType1::ConstPointer A,
+                            typename ImageType2::ConstPointer B);
+
+template<class ImageType1, class ImageType2>
+bool HaveSameSizeAndSpacing(typename ImageType1::Pointer A,
+                            typename ImageType2::Pointer B);
 
 #include "clitkImageCommon.txx"
 
index 9d8d6e131b62c47bdedd20b599a0b77f8ba56f46..5aa3b2eba55e44db3e973328c370b05935f95cab 100644 (file)
@@ -21,7 +21,7 @@
 
 //--------------------------------------------------------------------
 template<class PixelType>
-typename itk::Image<PixelType,1>::Pointer 
+typename itk::Image<PixelType,1>::Pointer
 NewImage1D(int vsize, double vspacing)
 {
   typedef itk::Image<PixelType,1> ImageType;
@@ -40,7 +40,7 @@ NewImage1D(int vsize, double vspacing)
 
 //--------------------------------------------------------------------
 template<class PixelType>
-typename itk::Image<PixelType,2>::Pointer 
+typename itk::Image<PixelType,2>::Pointer
 NewImage2D(int sx, int sy, double dx, double dy)
 {
   typedef itk::Image<PixelType,2> ImageType;
@@ -62,7 +62,7 @@ NewImage2D(int sx, int sy, double dx, double dy)
 
 //--------------------------------------------------------------------
 template<class PixelType>
-typename itk::Image<PixelType,3>::Pointer 
+typename itk::Image<PixelType,3>::Pointer
 NewImage3D(int sx, int sy, int sz, double dx, double dy, double dz)
 {
   typedef itk::Image<PixelType,3> ImageType;
@@ -323,13 +323,12 @@ void ComputeWeightsOfEachClasses(const typename InputImageType::Pointer & input,
 
 //--------------------------------------------------------------------
 template<class ImageType1, class ImageType2>
-bool HaveSameSizeAndSpacing(typename ImageType1::ConstPointer A, 
-                           typename ImageType2::ConstPointer B) 
+bool HaveSameSpacing(typename ImageType1::ConstPointer A,
+                     typename ImageType2::ConstPointer B)
 {
   if (A->GetImageDimension() != B->GetImageDimension()) return false;
   for(unsigned int i=0; i<A->GetImageDimension(); i++) {
     if (A->GetSpacing()[i] != B->GetSpacing()[i]) return false;
-    if (A->GetLargestPossibleRegion().GetSize()[i] != B->GetLargestPossibleRegion().GetSize()[i]) return false;
   }
   return true;
 }
@@ -337,13 +336,12 @@ bool HaveSameSizeAndSpacing(typename ImageType1::ConstPointer A,
 
 //--------------------------------------------------------------------
 template<class ImageType1, class ImageType2>
-bool HaveSameSizeAndSpacing(typename ImageType1::Pointer A, 
-                           typename ImageType2::Pointer B) 
+bool HaveSameSpacing(typename ImageType1::Pointer A,
+                     typename ImageType2::Pointer B)
 {
   if (A->GetImageDimension() != B->GetImageDimension()) return false;
   for(unsigned int i=0; i<A->GetImageDimension(); i++) {
     if (A->GetSpacing()[i] != B->GetSpacing()[i]) return false;
-    if (A->GetLargestPossibleRegion().GetSize()[i] != B->GetLargestPossibleRegion().GetSize()[i]) return false;
   }
   return true;
 }
@@ -351,12 +349,12 @@ bool HaveSameSizeAndSpacing(typename ImageType1::Pointer A,
 
 //--------------------------------------------------------------------
 template<class ImageType1, class ImageType2>
-bool HaveSameSpacing(typename ImageType1::ConstPointer A, 
-                     typename ImageType2::ConstPointer B) 
+bool HaveSameSize(typename ImageType1::ConstPointer A,
+                  typename ImageType2::ConstPointer B)
 {
   if (A->GetImageDimension() != B->GetImageDimension()) return false;
   for(unsigned int i=0; i<A->GetImageDimension(); i++) {
-    if (A->GetSpacing()[i] != B->GetSpacing()[i]) return false;
+    if (A->GetLargestPossibleRegion().GetSize()[i] != B->GetLargestPossibleRegion().GetSize()[i]) return false;
   }
   return true;
 }
@@ -364,16 +362,36 @@ bool HaveSameSpacing(typename ImageType1::ConstPointer A,
 
 //--------------------------------------------------------------------
 template<class ImageType1, class ImageType2>
-bool HaveSameSpacing(typename ImageType1::Pointer A, 
-                           typename ImageType2::Pointer B) 
+bool HaveSameSize(typename ImageType1::Pointer A,
+                  typename ImageType2::Pointer B)
 {
   if (A->GetImageDimension() != B->GetImageDimension()) return false;
   for(unsigned int i=0; i<A->GetImageDimension(); i++) {
-    if (A->GetSpacing()[i] != B->GetSpacing()[i]) return false;
+    if (A->GetLargestPossibleRegion().GetSize()[i] != B->GetLargestPossibleRegion().GetSize()[i]) return false;
   }
   return true;
 }
 //--------------------------------------------------------------------
 
+//--------------------------------------------------------------------
+template<class ImageType1, class ImageType2>
+bool HaveSameSizeAndSpacing(typename ImageType1::ConstPointer A,
+                            typename ImageType2::ConstPointer B)
+{
+  return ( HaveSameSize<ImageType1, ImageType2>(A, B) &&
+           HaveSameSpacing<ImageType1, ImageType2>(A, B) );
+}
+//--------------------------------------------------------------------
+
+//--------------------------------------------------------------------
+template<class ImageType1, class ImageType2>
+bool HaveSameSizeAndSpacing(typename ImageType1::Pointer A,
+                            typename ImageType2::Pointer B)
+{
+  return ( HaveSameSize<ImageType1, ImageType2>(A, B) &&
+           HaveSameSpacing<ImageType1, ImageType2>(A, B) );
+}
+//--------------------------------------------------------------------
+
 #endif /* end #define CLITKIMAGECOMMON_TXX */
 
index 81356df1c808a66cebda79e307746c6710258524..2eb3a0261c280da9193d39e270d1746f6a478944 100644 (file)
@@ -85,15 +85,9 @@ template<class ImageType>
 void clitk::MorphoMathFilter<ImageType>::
 SetOperationType(int type)
 {
-  switch (type) {
-  case 0: m_OperationType = Erode; return;
-  case 1: m_OperationType = Dilate; return;
-  case 2: m_OperationType = Open; return;
-  case 3: m_OperationType = Close; return;
-  case 4: m_OperationType = CondErode; return;
-  case 5: m_OperationType = CondDilate; return;
-  default: clitkExceptionMacro("Operation type must be between 0-5 (0=Erode, 1=Dilate, 2=Close (erode(dilate(x))), 3=Open (dilate(erode(x))), 4=CondErode, 5=CondDilate)");
-  }    
+  if(type<0 || type>5)
+    clitkExceptionMacro("Operation type must be between 0-5 (0=Erode, 1=Dilate, 2=Close (erode(dilate(x))), 3=Open (dilate(erode(x))), 4=CondErode, 5=CondDilate)");
+  m_OperationType = OperationTypeEnumeration(type);
 }
 //--------------------------------------------------------------------
 
index c758cb2f80273b6c7576abfe04626f0adee996ff..ef81fe2d464bc7082ed42a8f2d9ae1d5856ea3dc 100644 (file)
@@ -168,7 +168,20 @@ AffineTransformGenericFilter<args_info_type>::UpdateWithDimAndPixelType()
     typename itk::Matrix<double, Dimension, Dimension> invRotMatrix( clitk::GetRotationalPartMatrix(invMatrix) );
     typename itk::Vector<double,Dimension> invTrans =  clitk::GetTranslationPartMatrix(invMatrix);
 
-    // Size is converted to double, transformed and converted back to size type
+    // Spacing is influenced by affine transform matrix and input direction
+    typename InputImageType::SpacingType outputSpacing;
+    outputSpacing = invRotMatrix *
+                    input->GetDirection() *
+                    input->GetSpacing();
+
+    // Origin is influenced by translation but not by input direction
+    typename InputImageType::PointType outputOrigin;
+    outputOrigin = invRotMatrix *
+                   input->GetOrigin() +
+                   invTrans;
+
+    // Size is influenced by affine transform matrix and input direction
+    // Size is converted to double, transformed and converted back to size type.
     vnl_vector<double> vnlOutputSize(Dimension);
     for(unsigned int i=0; i< Dimension; i++) {
       vnlOutputSize[i] = input->GetLargestPossibleRegion().GetSize()[i];
@@ -178,18 +191,18 @@ AffineTransformGenericFilter<args_info_type>::UpdateWithDimAndPixelType()
                     vnlOutputSize;
     typename OutputImageType::SizeType outputSize;
     for(unsigned int i=0; i< Dimension; i++) {
+      // If the size is negative, we have a flip and we must modify
+      // the origin and the spacing accordingly.
+      if(vnlOutputSize[i]<0.) {
+        vnlOutputSize[i] *= -1.;
+        outputOrigin[i] = outputOrigin[i] + outputSpacing[i] * (vnlOutputSize[i]-1);
+        outputSpacing[i] *= -1.;
+      }
       outputSize[i] = lrint(vnlOutputSize[i]);
     }
     resampler->SetSize( outputSize );
-    
-    // Spacing can be dictly computed in the same way
-    resampler->SetOutputSpacing ( invRotMatrix *
-                                  input->GetDirection() *
-                                  input->GetSpacing() );
-    // Origin is influenced by translation but not by direction
-    resampler->SetOutputOrigin ( invRotMatrix *
-                                 input->GetOrigin() +
-                                 invTrans );
+    resampler->SetOutputSpacing( outputSpacing );
+    resampler->SetOutputOrigin( outputOrigin );
   } else {
     //Size
     typename OutputImageType::SizeType outputSize;
index 38f7c505ba3cd3cf3bad54011e1269794c86cc08..24ebbbdac8d2d472ec6ddca3eebbdcfdd5f33f6f 100644 (file)
@@ -128,9 +128,12 @@ void ImageArithmGenericFilter<args_info_type>::UpdateWithInputImageType()
       // Set input image iterator
       it2 = IteratorType(input2, input2->GetLargestPossibleRegion());
       // Check dimension
-      if (!clitk::HaveSameSizeAndSpacing<ImageType, ImageType>(input1, input2)) {
-          std::cerr << "* ERROR * the images (input and input2) must have the same size & spacing";
-          return;
+      if (!clitk::HaveSameSize<ImageType, ImageType>(input1, input2)) {
+        itkExceptionMacro(<< "The images (input and input2) must have the same size");
+      }
+      if(!clitk::HaveSameSpacing<ImageType, ImageType>(input1, input2)) {
+        itkWarningMacro(<< "The images (input and input2) do not have the same spacing. "
+                        << "Using first input's information.");
       }
   }
 
index f018b954271f487720be43dc8042cca59947517e..7f29dfe8dc442bd7f213d7d39d9e70a4a70c895c 100644 (file)
@@ -8,10 +8,10 @@ int main(int argc, char** argv) {
   const unsigned int dim = 3;
   typedef char PixelType;
   typedef itk::Image<PixelType, dim> ImageType;
-  typedef typename ImageType::IndexType IndexType;
-  typedef typename ImageType::PointType PointType;
-  typedef typename ImageType::SizeType SizeType;
-  typedef typename ImageType::RegionType RegionType;
+  typedef ImageType::IndexType IndexType;
+  typedef ImageType::PointType PointType;
+  typedef ImageType::SizeType SizeType;
+  typedef ImageType::RegionType RegionType;
 
   IndexType index;
   index.Fill(0);
@@ -30,12 +30,12 @@ int main(int argc, char** argv) {
   region.SetIndex(index);
   region.SetSize(size);
 
-  typename ImageType::Pointer image = ImageType::New();
+  ImageType::Pointer image = ImageType::New();
   image->SetRegions(region);
   image->Allocate();
   
   typedef itk::SphereSpatialFunction<dim, PointType> ShpereFunctionType;
-  typename ShpereFunctionType::Pointer sphere = ShpereFunctionType::New();
+  ShpereFunctionType::Pointer sphere = ShpereFunctionType::New();
   
   double radius = atof(argv[8])/2;
   sphere->SetCenter(origin);
@@ -56,7 +56,7 @@ int main(int argc, char** argv) {
   }
   
   typedef itk::ImageFileWriter<ImageType> ImageWriterType;
-  typename ImageWriterType::Pointer writer = ImageWriterType::New();
+  ImageWriterType::Pointer writer = ImageWriterType::New();
   writer->SetInput(image);
   writer->SetFileName(argv[1]);
   writer->Update();
index 6b52ea1abc1e7b5f737946df19c1e2748bc7cf64..302da7eae2689d6d7ef7d2657a6fa42e80babc4f 100644 (file)
@@ -369,7 +369,8 @@ void vvSlicer::SetOverlay(vvImage::Pointer overlay)
       this->GetRenderer()->AddActor(mOverlayActor);
 
     //Synchronize orientation and slice
-    this->SetSliceOrientation(this->SliceOrientation);
+    AdjustResliceToSliceOrientation(mOverlayReslice);
+    this->UpdateDisplayExtent();
     this->SetTSlice(mCurrentTSlice);
   }
 }
@@ -412,7 +413,8 @@ void vvSlicer::SetFusion(vvImage::Pointer fusion)
     }
 
     //Synchronize orientation and slice
-    this->SetSliceOrientation(this->SliceOrientation);
+    AdjustResliceToSliceOrientation(mFusionReslice);
+    this->UpdateDisplayExtent();
     this->SetTSlice(mCurrentTSlice);
   }
 }