X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=vv%2FvvImageReader.cxx;h=0076bf7663767d212d2306b7c52fe8c124fa012b;hb=3d059f81bab4d113bdd5e87bc15a266381ee7182;hp=fde48ce89e5a7e99d462e833b30b5618472dee79;hpb=0b7c9b1e1215634b02cbd38d4e4ba101d6111ba8;p=clitk.git diff --git a/vv/vvImageReader.cxx b/vv/vvImageReader.cxx index fde48ce..0076bf7 100644 --- a/vv/vvImageReader.cxx +++ b/vv/vvImageReader.cxx @@ -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://oncora1.lyon.fnclcc.fr - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr @@ -14,96 +14,170 @@ - BSD See included LICENSE.txt file - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html -======================================================================-====*/ -#ifndef vvImageReader_CXX -#define vvImageReader_CXX + ======================================================================-====*/ +#ifndef VVIMAGEREADER_CXX +#define VVIMAGEREADER_CXX + #include #include #include "vvImageReader.h" #include "vvImageReader.txx" +#include "clitkTransformUtilities.h" - -//==================================================================== +//------------------------------------------------------------------------------ vvImageReader::vvImageReader() { - mImage = NULL; - mInputFilenames.resize(0); - mLastError = ""; - mType = UNDEFINEDIMAGETYPE; + mImage = NULL; + mInputFilenames.resize(0); + mLastError = ""; + mType = UNDEFINEDIMAGETYPE; + mSlice = 0; } +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ vvImageReader::~vvImageReader() { } +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ void vvImageReader::Update() { - Update(mType); + Update(mType); } +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ void vvImageReader::Update(LoadedImageType type) { - itk::ImageIOBase::Pointer reader = itk::ImageIOFactory::CreateImageIO(mInputFilenames[0].c_str(), itk::ImageIOFactory::ReadMode); - if (!reader) { - mLastError="Unable to read file."; - } - else { - reader->SetFileName(mInputFilenames[0]); - reader->ReadImageInformation(); - if (mInputFilenames.size() > 1) - Update(reader->GetNumberOfDimensions()+1,reader->GetComponentTypeAsString(reader->GetComponentType()),type); - else - Update(reader->GetNumberOfDimensions(),reader->GetComponentTypeAsString(reader->GetComponentType()),type); - } + itk::ImageIOBase::Pointer reader = itk::ImageIOFactory::CreateImageIO(mInputFilenames[0].c_str(), itk::ImageIOFactory::ReadMode); + if (!reader) { + mLastError="Unable to read file."; + } else { + reader->SetFileName(mInputFilenames[0]); + reader->ReadImageInformation(); + if (mInputFilenames.size() > 1) + Update(reader->GetNumberOfDimensions()+1,reader->GetComponentTypeAsString(reader->GetComponentType()),type); + else + Update(reader->GetNumberOfDimensions(),reader->GetComponentTypeAsString(reader->GetComponentType()),type); + } } +//------------------------------------------------------------------------------ -//==================================================================== -void vvImageReader::Update(int dim,std::string inputPixelType, LoadedImageType type) { - //CALL_FOR_ALL_DIMS(dim,UpdateWithDim,inputPixelType); - mType = type; - mDim = dim; - mInputPixelType=inputPixelType; - this->start(); //Start heavy read operation in a separate thread - while (this->isRunning()) - { - qApp->processEvents(); - this->wait(50); - } + +//------------------------------------------------------------------------------ +void vvImageReader::Update(int dim,std::string inputPixelType, LoadedImageType type) +{ + //CALL_FOR_ALL_DIMS(dim,UpdateWithDim,inputPixelType); + mType = type; + mDim = dim; + mInputPixelType=inputPixelType; + this->start(); //Start heavy read operation in a separate thread + while (this->isRunning()) { + qApp->processEvents(); + this->wait(50); + } } +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ void vvImageReader::run() { - switch(mDim) - { - case 2: - UpdateWithDim<2>(mInputPixelType); - break;; - case 3: - UpdateWithDim<3>(mInputPixelType); - break;; - case 4: - UpdateWithDim<4>(mInputPixelType); - break;; - default: - std::cerr << "dimension unknown in Update ! " << std::endl; - } + switch(mDim) { + case 2: + UpdateWithDim<2>(mInputPixelType); + break;; + case 3: + UpdateWithDim<3>(mInputPixelType); + break;; + case 4: + UpdateWithDim<4>(mInputPixelType); + break;; + default: + std::cerr << "dimension unknown in Update ! " << std::endl; + } } -//==================================================================== +//------------------------------------------------------------------------------ + -//==================================================================== -/*void vvImageReader::Extract(int dim, std::string inputPixelType, int slice) { - CALL_FOR_ALL_DIMS(dim, ExtractWithDim, inputPixelType, slice); -}*/ -//==================================================================== +//------------------------------------------------------------------------------ void vvImageReader::SetInputFilename(const std::string & filename) { - mInputFilenames.resize(0); - mInputFilenames.push_back(filename); + mInputFilenames.resize(0); + mInputFilenames.push_back(filename); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvImageReader::SetInputFilenames(const std::vector & filenames) +{ + mInputFilenames = filenames; } +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +//Read transformation in NKI format (Xdr, transposed, cm) +void vvImageReader::ReadNkiImageTransform() +{ + bool bRead=false; + std::string filename = mInputFilenames[0]+".MACHINEORIENTATION"; + if(itksys::SystemTools::FileExists(filename.c_str())){ + typedef itk::ImageFileReader< itk::Image< double, 2 > > MatrixReaderType; + MatrixReaderType::Pointer readerTransfo = MatrixReaderType::New(); + readerTransfo->SetFileName(filename); + try { + bRead = true; + readerTransfo->Update(); + } catch( itk::ExceptionObject & err ) { + bRead=false; + std::cerr << "Cannot read " << filename << std::endl + << "The error is: " << err << std::endl; + } -//==================================================================== -void vvImageReader::SetInputFilenames(const std::vector & filenames) { - mInputFilenames = filenames; + if (bRead) { + //Transpose matrix (NKI format) + for(int j=0; j<4; j++) + for(int i=0; i<4; i++) + mImage->GetTransform()->GetMatrix()->SetElement(j,i,readerTransfo->GetOutput()->GetBufferPointer()[4*i+j]); + + //From cm to mm + for(int i=0; i<3; i++) + mImage->GetTransform()->GetMatrix()->SetElement(i,3,10*mImage->GetTransform()->GetMatrix()->GetElement(i,3)); + + mImage->GetTransform()->Inverse(); + } + } } -//==================================================================== +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ +//Read transformation in ASCII format +void vvImageReader::ReadMatImageTransform() +{ + std::string filename(mInputFilenames[0]+".mat"); + std::ifstream f(filename.c_str()); + if(f.is_open()) { + f.close(); + + itk::Matrix itkMat = clitk::ReadMatrix3D(filename); + + vtkSmartPointer transform = vtkSmartPointer::New(); + transform->Identity(); + for(int j=0; j<4; j++) + for(int i=0; i<4; i++) + transform->GetMatrix()->SetElement(j,i,itkMat[j][i]); + + mImage->GetTransform()->PostMultiply(); + mImage->GetTransform()->Concatenate(transform->GetMatrix()); + mImage->GetTransform()->Update(); + } +} +//------------------------------------------------------------------------------ #endif