X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=common%2FvvImageReader.cxx;h=0205355f6fafc40acd2dc82984ce11f1412dddc4;hb=64498b6c898ee1931363975cfe72cc5b232d7a0c;hp=715c4c50ad1c5ff6d242f4af8ca3c6faeb422891;hpb=765020625fbc092d283e221e36c83e60a1844cb7;p=clitk.git diff --git a/common/vvImageReader.cxx b/common/vvImageReader.cxx index 715c4c5..0205355 100644 --- a/common/vvImageReader.cxx +++ b/common/vvImageReader.cxx @@ -148,13 +148,21 @@ void vvImageReader::ReadNkiImageTransform() //Read transformation in ASCII format void vvImageReader::ReadMatImageTransform() { - std::string filename(mInputFilenames[0]+".mat"); + std::string filename(mInputFilenames[0]); + std::string ext(itksys::SystemTools::GetFilenameLastExtension(filename)); + 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()); if(f.is_open()) { f.close(); - + itk::Matrix itkMat = clitk::ReadMatrix3D(filename); - + vtkSmartPointer matrix = vtkSmartPointer::New(); matrix->Identity(); for(int j=0; j<4; j++) @@ -166,22 +174,26 @@ void vvImageReader::ReadMatImageTransform() // file is inverted wrt the transformation given in the MAT file. // We don't really know where the inversion takes place inside // VTK or ITK. For what we could see in VV, the transformation - // given in the MHD file seems "more correct" than that given in + // given in the MHD file seems "more correct" than that given in // the MAT file. For this reason, we invert the matrix read from // the MAT file before concatenating it to the current transformation. // Still, it would be nice to find out what happens exactly between // VTK and ITK... // - vtkSmartPointer inv_matrix = vtkSmartPointer::New(); + // SR: 23/06/2011 + // We actually use vtkImageReslice which takes the inverse transform + // as input. So it seems more correct to inverse the matrix given by + // itk::ImageBase< VImageDimension >::GetDirection() than the matrix + // in .mat which is indeed the inverse optimized by a typical + // affine registration algorithm. + // Validated using clitkAffineTransform --transform_grid if (matrix->Determinant() == 0) { vtkGenericWarningMacro("Matrix in " << filename.c_str() << " cannot be inverted (determinant = 0)"); } - else - matrix->Invert(*matrix, *inv_matrix); - + mImage->GetTransform()->PostMultiply(); - mImage->GetTransform()->Concatenate(inv_matrix); + mImage->GetTransform()->Concatenate(matrix); mImage->GetTransform()->Update(); } }