2016-06-14 1 views
1

Comment charger et écrire .mhd/. Format d'image 3D dans ITK? J'ai essayé d'utiliser le code suivant mais il n'est pas chargé car la dimension de l'image chargée est affichée comme 0,0,0. Est-ce que quelqu'un peut signaler l'erreur que je commets?Lecture * .mhd/*. Images au format brut en ITK

typedef float InputPixelType; 
const unsigned int DimensionOfRaw = 3; 
typedef itk::Image< InputPixelType, DimensionOfRaw > InputImageType; 

//typedef itk::RawImageIO<InputPixelType, DimensionOfRaw> ImageIOType; 
typedef itk::ImageFileReader<InputImageType > ReaderType; 

/* 
* --------------------Loader and saver of Raws, as well the function that takes a resulting (from inference matrix/vector) and creates a Raw out of it.----------------------- 
*/ 
InputImageType::Pointer loadRawImageItk(std::string RawFullFilepathname, ReaderType::Pointer & RawImageIO) { 
    //http://www.itk.org/Doxygen/html/classitk_1_1Image.html 
    //http://www.itk.org/Doxygen/html/classitk_1_1ImageFileReader.html 

    typedef itk::ImageFileReader<InputImageType> ReaderType; 

    ReaderType::Pointer reader = ReaderType::New(); 
    reader->SetFileName(RawFullFilepathname); 


    //ImageIOType::Pointer RawImageIO = ImageIOType::New(); 
    reader->SetImageIO(RawImageIO); 

    try { 
     reader->Update(); 
    } catch (itk::ExceptionObject& e) { 
     std::cerr << e.GetDescription() << std::endl; 
     exit(1); // You can choose to do something else, of course. 
    } 

    //InputImageType::Pointer inputImage = reader->GetOutput(); 
    InputImageType::Pointer inputImage = reader->GetOutput(); 

    return inputImage; 

} 


int saveRawImageItk(std::string RawFullFilepathname, InputImageType::Pointer & outputImageItkType , ImageIOType::Pointer & RawImageIO) { 
    std::cout << "Saving image to: " << RawFullFilepathname << "\n"; 

    typedef itk::ImageFileWriter<InputImageType> Writer1Type; 
    Writer1Type::Pointer writer1 = Writer1Type::New(); 

    writer1->SetInput(outputImageItkType); 
    writer1->SetFileName(RawFullFilepathname); 
    writer1->SetImageIO(RawImageIO); //seems like this is useless. 

    // Execution of the writer is triggered by invoking the \code{Update()} method. 
    try 
    { 
    writer1->Update(); 
    } 
    catch (itk::ExceptionObject & e) 
    { 
    std::cerr << "exception in file writer " << std::endl; 
    std::cerr << e.GetDescription() << std::endl; 
    std::cerr << e.GetLocation() << std::endl; 
    return 1; 
    } 

    return 0; 
} 
+0

Peut-être qu'il ya un problème avec vos données. Vous devriez au moins fournir quelques exemples de données. – Trilarion

Répondre

1

Je viens de lire les mhd et les fichiers bruts en Python avec succès en utilisant le code suivant SimpleITK:

import SimpleITK as sitk 
import numpy as np 
def load_itk_image(filename): 
    itkimage = sitk.ReadImage(filename) 
    numpyImage = sitk.GetArrayFromImage(itkimage) 
    return numpyImage 

Peut-être que vous pouvez l'utiliser comme référence. Si vous devez utiliser la fonction ReadImage à la place de ImageFileReader?

Tu peux essayer.

0

Voici quelques bons exemples de lecture de fichiers en fonction d'un format connu.

reader->SetImageIO(RawImageIO);

semble la chose incorrecte à faire ici si vous chargez les .mhd et les fichiers .raw comme ils sont des formats séparés, MetaImage vs format RAW où vous faites et ne connaissez pas la taille de l'image, l'origine , espacement, etc, basé sur l'absence ou la présence d'un en-tête.

Comment déterminez-vous la taille de l'image et obtenir (0,0,0)? image-> GetSize()?

Pouvez-vous fournir des données de test?

https://itk.org/Wiki/ITK/Examples/IO/ReadUnknownImageType

https://itk.org/ITKExamples/src/IO/ImageBase/RegisterIOFactories/Documentation.html