C# 使用SimpleTk for C读取原始图像文件
如何使用SimpleTk for C读取原始文件 我在Windows 64位上使用SimpleTk C版本0.5.1 我的代码是: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(); 例如,它适用
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]