读取 *.mhd/*.raw 在 ITK 中格式化 3D 图像

Reading *.mhd/*.raw format 3D images in ITK

本文关键字:格式化 图像 ITK 3D mhd raw 读取      更新时间:2023-10-16

如何在ITK中加载和写入.mhd/ .raw格式的3D图像?我尝试使用以下代码,但由于加载图像的尺寸显示为 0,0,0,0,它没有加载。

有人可以指出我犯的错误吗?

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;
}

我刚刚使用以下 SimpleITK 代码成功读取了 Python 中的 mhd 和原始文件:

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?你可以试一试。

这里有一些根据已知格式读取文件的好例子。

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