C# 使用SimpleTk for C读取原始图像文件

C# 使用SimpleTk for C读取原始图像文件,c#,itk,C#,Itk,如何使用SimpleTk for C读取原始文件 我在Windows 64位上使用SimpleTk 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(); 例如,它适用

如何使用SimpleTk for C读取原始文件

我在Windows 64位上使用SimpleTk 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或分析图像,但不适用于原始图像

我得到以下错误:

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模板被隐藏,有没有办法在SimpleTk中传递图像类型和图像参数?

多亏了Insight Users group,我找到了一些解决此问题的线索。 问题是ImageFileReader无法读取原始文件。解决方案是手动读取二进制数据并使用ImportImageFilter构建图像对象。代码如下:

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

多亏了Insight用户组,我得到了一些解决这个问题的线索。 问题是ImageFileReader无法读取原始文件。解决方案是手动读取二进制数据并使用ImportImageFilter构建图像对象。代码如下:

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

SimpelITK常见问题解答[1]也回答了这个问题:

通常,原始图像文件缺少信息。它们不包含用于描述数据基本大小和类型的Nesseary标头信息,因此这种格式存在本质缺陷。RawImageIO类在SimpleTk中不可用,因此没有直接的方法以编程方式硬编码此标头信息。建议的方法是创建一个元映像头文件*.mhd,它引用原始数据文件并描述数据的大小和类型。关于如何编写元映像头的文档可以在这里找到。 下面是一个示例元映像头文件,可能名为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] SimpelITK常见问题解答[1]也回答了这个问题:

通常,原始图像文件缺少信息。它们不包含用于描述数据基本大小和类型的Nesseary标头信息,因此这种格式存在本质缺陷。RawImageIO类在SimpleTk中不可用,因此没有直接的方法以编程方式硬编码此标头信息。建议的方法是创建一个元映像头文件*.mhd,它引用原始数据文件并描述数据的大小和类型。关于如何编写元映像头的文档可以在这里找到。 下面是一个示例元映像头文件,可能名为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]