2016-06-14 3 views
1

Как загрузить и написать .mhd/. Формате 3D-изображения в ITK? Я попытался использовать следующий код, но он не загружается, поскольку размер загруженного изображения отображается как 0,0,0.Чтение * .mhd/*. Необработанного формата 3D-изображения в 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

Может быть, это проблема с вашими данными. Вы должны хотя бы предоставить некоторые примеры данных. – Trilarion

ответ

1

Я только читать MHD и необработанных файлов в Python успешно используя следующий код SimpleITK:

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

Может быть, вы можете использовать его в качестве ссылки.

Следует ли использовать функцию ReadImage вместо ImageFileReader? Вы можете попробовать.

0

Несколько хороших примеров чтения файлов в зависимости от известного формата находятся здесь.

reader->SetImageIO(RawImageIO);

кажется неверной вещь, чтобы сделать здесь, если вы загружаете как .mhd и .raw файлы, поскольку они являются отдельными форматами, MetaImage против формата Raw, где вы делаете, и не знаете размера изображения, происхождение , интервал и т. д., основанный на отсутствии или присутствии заголовка.

Как вы определяете размер изображения и получение (0,0,0)? image-> GetSize()?

Можете ли вы предоставить данные испытаний?

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

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