X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=common%2FvvImageReader.cxx;h=2c094a8c3eda3cfb67e85acddafb9cceb1bf562c;hb=19b462067f2b839ebb7e7cc8ba84aa14f4152e8b;hp=c795cd9299697c7a34c784c1973541c7012e777d;hpb=2191f760d44987f901445c4105c577df7995b25d;p=clitk.git diff --git a/common/vvImageReader.cxx b/common/vvImageReader.cxx index c795cd9..2c094a8 100644 --- a/common/vvImageReader.cxx +++ b/common/vvImageReader.cxx @@ -22,6 +22,7 @@ #include "vvImageReader.h" #include "vvImageReader.txx" #include "clitkTransformUtilities.h" +#include "clitkElastix.h" //------------------------------------------------------------------------------ vvImageReader::vvImageReader() @@ -77,13 +78,13 @@ void vvImageReader::Update(int dim,std::string inputPixelType, LoadedImageType t switch(mDim) { case 2: UpdateWithDim<2>(mInputPixelType); - break;; + break; case 3: UpdateWithDim<3>(mInputPixelType); - break;; + break; case 4: UpdateWithDim<4>(mInputPixelType); - break;; + break; default: std::cerr << "dimension unknown in Update ! " << std::endl; } @@ -150,19 +151,48 @@ void vvImageReader::ReadMatImageTransform() { std::string filename(mInputFilenames[0]); std::string ext(itksys::SystemTools::GetFilenameLastExtension(filename)); + + // Try a ".mat" extension if (ext.length() > 0) { size_t pos = filename.rfind(ext); filename.replace(pos, ext.length(), ".mat"); } else filename += ".mat"; - std::ifstream f(filename.c_str()); + itk::Matrix itkMat; + bool itkMatRead = false; if(f.is_open()) { - f.close(); + itkMatRead = true; - itk::Matrix itkMat = clitk::ReadMatrix3D(filename); + itkMat.SetIdentity(); + try { + itkMat = clitk::ReadMatrix3D(filename); + } + catch (itk::ExceptionObject & err) { + itkWarningMacro(<< "Found " << filename + << " but this is not a 4x4 matrix so it is ignored."); + itkMatRead = false; + } + } + f.close(); + + // Try a ".elx" extension + filename = mInputFilenames[0]; + if (ext.length() > 0) { + size_t pos = filename.rfind(ext); + filename.replace(pos, ext.length(), ".elx"); + } + else + filename += ".elx"; + f.open(filename.c_str()); + if(!itkMatRead && f.is_open()) { + itkMatRead = true; + itkMat = clitk::createMatrixFromElastixFile<3>(filename, true); + } + f.close(); + if(itkMatRead) { vtkSmartPointer matrix = vtkSmartPointer::New(); matrix->Identity(); for(int j=0; j<4; j++) @@ -193,9 +223,21 @@ void vvImageReader::ReadMatImageTransform() } // TODO SR and BP: check on the list of transforms and not the first only - mImage->GetTransform()[0]->PostMultiply(); + mImage->GetTransform()[0]->PreMultiply(); mImage->GetTransform()[0]->Concatenate(matrix); mImage->GetTransform()[0]->Update(); + + //for image sequences, apply the transform to each images of the sequence + if (mImage->IsTimeSequence()) + { + for (unsigned i = 1 ; iGetTransform().size() ; i++) + { + mImage->GetTransform()[i]->PreMultiply(); + mImage->GetTransform()[i]->Concatenate(matrix); + mImage->GetTransform()[i]->Update(); + } + } + } } //------------------------------------------------------------------------------