1

如何使用 SimpleITK for C# 读取 RAW 文件?

我在 Windows(64 位)上使用 SimpleITK C# 版本 0.5.1

我的代码是:

String fileName = @"d:\Temp\MRI\t1_icbm_normal_1mm_pn3_rf20.rawb";
ImageFileReader reader = new ImageFileReader();
reader.SetFileName(fileName);
Image image = reader.Execute();

例如,它适用于 .png 或分析图像,但不适用于 RAW 图像。

我收到以下错误:

System.ApplicationException : Exception thrown in SimpleITK ImageFileReader_Execute: ..\\..\\..\\..\\..\SimpleITK\Code\IO\src\sitkImageReaderBase.cxx:44:
sitk::ERROR: Unable to determine ImageIO reader for "d:\Temp\MRI\t1_icbm_normal_1mm_pn3_rf20.rawb"

我了解 ImageFileReader 无法识别文件类型。由于标准 ITK 模板是隐藏的,有没有办法在 SimpleITK 中传递图像类型和图像参数?

4

2 回答 2

4

感谢 Insight-Users 组,我得到了一些解决这个问题的线索。问题是 ImageFileReader 无法读取 RAW 文件。解决方案是手动读取二进制数据并使用 ImportImageFilter 构建 Image 对象。代码如下:

    [Test]
    public void ReadImageRAW()
    {
        String fileName = @"d:\Temp\MRI\t1_icbm_normal_1mm_pn3_rf20.rawb";

        Byte[] imageData = System.IO.File.ReadAllBytes(fileName);

        UInt32 width = 181;
        UInt32 height = 217;
        UInt32 depth = 181;

        ImportImageFilter importImageFilter = new ImportImageFilter();

        importImageFilter.SetSize(new VectorUInt32(new UInt32[] {width, height, depth}));

        importImageFilter.SetDirection(new VectorDouble(new Double[] {1, 0, 0, 
                                                                      0, 1, 0, 
                                                                      0, 0, 1}));

        importImageFilter.SetOrigin(new VectorDouble(new Double[] { 0, 0, 0 }));

        importImageFilter.SetSpacing(new VectorDouble(new Double[] {1, 1, 1}));

        GCHandle hObject = GCHandle.Alloc(imageData, GCHandleType.Pinned);
        IntPtr imageDataPtr = hObject.AddrOfPinnedObject();

        importImageFilter.SetBufferAsUInt8(imageDataPtr);

        Image importedImage = importImageFilter.Execute();
        SimpleITK.Show(importedImage);
    }
于 2012-10-28T10:41:38.990 回答
0

SimpelITK FAQ [1] 中也回答了这个问题:

通常原始图像文件缺少信息。它们不包含描述数据基本大小和类型的必要标题信息,因此这种格式本质上是有缺陷的。RawImageIO 类在 SimpleITK 中不可用,因此没有直接的方法以编程方式硬编码此标头信息。建议的方法是创建一个元图像头文件 (*.mhd),它引用原始数据文件并描述数据的大小和类型。可以在此处找到有关如何编写 Meta 图像标头的文档。以下是一个示例 Meta 图像头文件,可能名称为 sample.mhd:

ObjectType = Image
NDims = 3
DimSize = 256 256 64
ElementType = MET_USHORT
ElementDataFile = image.raw (this tag must be last in a MetaImageHeader)

[1] http://www.itk.org/Wiki/SimpleITK/FAQ#How_do_I_read_a_RAW_image_into_SimpleITK.3F

于 2016-04-29T18:40:43.040 回答