使用SimpleITK for C#读取RAW图像文件

时间:2012-10-27 07:03:51

标签: c# itk

如何使用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无法识别文件类型。 有没有办法在SimpleITK中传递图像类型和图像参数,因为隐藏了标准的ITK模板?

2 个答案:

答案 0 :(得分: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);
    }

答案 1 :(得分:0)

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

通常,原始图像文件缺少信息。它们不包含用于描述数据的基本大小和类型的nessesary头信息,因此这种格式本质上是不足的。 RawImageIO类在SimpleITK中不可用,因此没有直接的方法以编程方式对此标头信息进行硬编码。建议的方法是创建一个元图像头文件(* .mhd),它引用原始数据文件并描述数据的大小和类型。有关如何编写元图像标题的文档可以在这里找到。 以下是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

相关问题