]> Creatis software - clitk.git/commitdiff
Correct bug when opening non 3D vector field
authorVivien Delmon <vivien.delmon@creatis.insa-lyon.fr>
Fri, 3 Feb 2012 12:22:57 +0000 (13:22 +0100)
committerVivien Delmon <vivien.delmon@creatis.insa-lyon.fr>
Fri, 3 Feb 2012 12:22:57 +0000 (13:22 +0100)
- vvImageReader was opening vector field of nD vectors with the itk 3D
  reader. Now we open the vector field with the appropriate itk reader
  and then convert it to 3D vectors which are the only one supported by
  vv.

common/vvImageReader.h
common/vvImageReader.txx

index 2f1de53537794d937e16c4770ff8828eeddeddd5..dae05e47047ec4d9fb335491b03645b9588560f0 100644 (file)
@@ -85,6 +85,8 @@ protected:
   //====================================================================
   template<class InputPixelType, unsigned int VImageDimension>
   void UpdateWithDimAndInputPixelType();
+  template<class InputPixelType, unsigned int VImageDimension>
+  void UpdateWithDimAndInputVectorPixelType();
   ///Input dimension and pixel type
   int mDim;
   std::string mInputPixelType;
index 2d7d5b573f3c9a2985bfef023c21f4a542c53537..e15e6d7688ff4a6a202e8f9e62bd42d133128ca5 100644 (file)
@@ -24,6 +24,7 @@
 #include <itkImageSeriesReader.h>
 #include <itkImageToVTKImageFilter.h>
 #include <itkAnalyzeImageIO.h>
+#include <itkVectorCastImageFilter.h>
 
 #include <vtkTransform.h>
 
@@ -35,7 +36,7 @@ template<unsigned int VImageDimension>
 void vvImageReader::UpdateWithDim(std::string InputPixelType)
 {
   if (mType == VECTORFIELD || mType == VECTORFIELDWITHTIME)
-    UpdateWithDimAndInputPixelType<itk::Vector<float,3>,VImageDimension>();
+    UpdateWithDimAndInputVectorPixelType<itk::Vector<float,VImageDimension>,VImageDimension>();
   else if (InputPixelType == "short")
     UpdateWithDimAndInputPixelType<short,VImageDimension>();
   else if (InputPixelType == "unsigned_short")
@@ -162,10 +163,7 @@ void vvImageReader::UpdateWithDimAndInputPixelType()
       reader->ReleaseDataFlagOn();
 
       try {
-        if (mType == IMAGEWITHTIME || mType == VECTORFIELDWITHTIME)
-          mImage=vvImageFromITK<VImageDimension,InputPixelType>(reader->GetOutput(),true);
-        else
-          mImage=vvImageFromITK<VImageDimension,InputPixelType>(reader->GetOutput());
+        mImage = vvImageFromITK<VImageDimension,InputPixelType>(reader->GetOutput(), mType == IMAGEWITHTIME || mType == VECTORFIELDWITHTIME);
       } catch ( itk::ExceptionObject & err ) {
         std::cerr << "Error while reading " << mInputFilenames[0].c_str()
                   << " " << err << std::endl;
@@ -195,6 +193,77 @@ void vvImageReader::UpdateWithDimAndInputPixelType()
 }
 //----------------------------------------------------------------------------
 
+//----------------------------------------------------------------------------
+template<class InputPixelType, unsigned int VImageDimension>
+void vvImageReader::UpdateWithDimAndInputVectorPixelType()
+{
+  itk::AnalyzeImageIO *analyzeImageIO = NULL;
+
+  typedef itk::Image< InputPixelType, VImageDimension > InputImageType;
+  typename InputImageType::Pointer input;
+
+  if (mInputFilenames.size() > 1) {
+    typedef itk::ImageSeriesReader<InputImageType> ReaderType;
+    typename ReaderType::Pointer reader = ReaderType::New();
+    reader->SetFileNames(mInputFilenames);
+    reader->ReleaseDataFlagOn();
+    try {
+      reader->Update();
+      input = reader->GetOutput();
+    } catch ( itk::ExceptionObject & err ) {
+      std::cerr << "Error while reading image series:" << err << std::endl;
+      std::stringstream error;
+      error << err;
+      mLastError = error.str();
+      return;
+    }
+  } else {
+    typedef itk::ImageFileReader<InputImageType> ReaderType;
+    typename ReaderType::Pointer reader = ReaderType::New();
+    reader->SetFileName(mInputFilenames[0]);
+    reader->ReleaseDataFlagOn();
+    try {
+      reader->Update();
+      input = reader->GetOutput();
+    } catch ( itk::ExceptionObject & err ) {
+      std::cerr << "Error while reading " << mInputFilenames[0].c_str()
+        << " " << err << std::endl;
+      std::stringstream error;
+      error << err;
+      mLastError = error.str();
+      return;
+    }
+    analyzeImageIO = dynamic_cast<itk::AnalyzeImageIO*>( reader->GetImageIO() );
+  }
+
+  typedef itk::Image< itk::Vector<float , 3>, VImageDimension > VectorImageType;
+  typedef itk::VectorCastImageFilter<InputImageType, VectorImageType> CasterType;
+  typename VectorImageType::Pointer casted_input;
+  typename CasterType::Pointer caster = CasterType::New();
+  caster->SetInput(input);
+  casted_input = caster->GetOutput();
+
+  mImage = vvImageFromITK<VImageDimension, itk::Vector<float, 3> >(casted_input, mType == IMAGEWITHTIME || mType == VECTORFIELDWITHTIME);
+
+  // For unknown analyze orientations, we set identity
+  if (analyzeImageIO)
+  {
+    const double m[16] = {1.,0.,0.,0.,
+                          0.,0.,1.,0.,
+                          0.,-1.,0.,0.,
+                          0.,0.,0.,1.};
+    int i;
+    for (i = 0; i < 16 && m[i] == mImage->GetTransform()->GetMatrix()->GetElement(i % 4, i / 4); i++)
+      ;
+    if (i == 16)
+    {
+      itkWarningMacro(<< "Analyze image file format detected with unknown orientation. "
+                      << "Forcing identity orientation, use other file format if not ok.");
+      mImage->GetTransform()->Identity();
+    }
+  }
+}
+//----------------------------------------------------------------------------
 
 #endif /* end #define vvImageReader_TXX */