Python 从.mha文件读取头信息

Python 从.mha文件读取头信息,python,itk,simpleitk,medical-imaging,Python,Itk,Simpleitk,Medical Imaging,我只想从.mha文件中读取标题。理想情况下,它将为我提供与读取仅包含元数据的.mhd文件相同的功能。 我正在使用SimpleTk进行读取,虽然它可以很好地读取图像,但我特别想创建一个元数据字典。 .mha基本上是将原始图像组合在一起的.mhd,但我找不到任何关于如何分离它们的规范。我在ITK文档中发现: 要跳过图像数据文件中的头字节,请使用 HeaderSize=X 其中X是读取图像数据之前要在文件开头跳过的字节数。如果您知道没有尾随字节(文件末尾的额外字节),则可以指定 HeaderSize=

我只想从
.mha
文件中读取标题。理想情况下,它将为我提供与读取仅包含元数据的
.mhd
文件相同的功能。
我正在使用SimpleTk进行读取,虽然它可以很好地读取图像,但我特别想创建一个元数据字典。
.mha
基本上是将原始图像组合在一起的
.mhd
,但我找不到任何关于如何分离它们的规范。我在ITK文档中发现:

要跳过图像数据文件中的头字节,请使用
HeaderSize=X

其中X是读取图像数据之前要在文件开头跳过的字节数。如果您知道没有尾随字节(文件末尾的额外字节),则可以指定
HeaderSize=-1

MetaImage将自动计算数据文件中提取字节的数量,假设这些字节位于数据文件的头部,并在开始读取图像数据之前自动跳过这些字节


但是我在SimpleTk中找不到这个功能。

SimpleTk有一个功能,允许您这样做,它通常用于DICOM和nifti文件格式。我使用它只读取MHD文件,而不将原始数据拉入内存:

导入路径库
将SimpleTk作为sitk导入
#使用pathlib,使其可以在任何操作系统上工作
mha_dir=pathlib.Path(“/you/files/location”)
mha_file=str(mha_dir.joinpath(mha_file))
#设置读卡器并获取文件信息
reader=sitk.ImageFileReader()
SetFileName(mha#U文件)#将mha文件作为字符串提供给它
reader.LoadPrivateTagsOn()#确保它可以获取所有信息
reader.ReadImageInformation()#仅从文件中获取信息
#从这里,您可以解析出您想要的任何内容,就像SimpleTk图像一样
xdim,ydim,zdim=reader.GetSize()#如果需要x,y,z
xres,yres,zres=reader.GetSpacing()#如果需要图像分辨率,等等。
meta_keys=reader.GetMetaDataKeys()
对于元密钥中的密钥:
打印(键)
打印(reader.GetMetaData(f'{key}'))

不幸的是,它并不能解决我的问题,因为我不想读取图像,我只想获得标题信息,而这里sitk没有在其元数据中显示,并且没有足够的
Get()
函数来提取所有内容(例如解剖方向)。我的RAM从来不会使用此功能来爬升14 GB的文件,所以我不认为它会在文件中读取。如果您想要mha中存在的元数据,您可以使用reader.GetMetaDataKeys(),然后您可以通过reader.GetMetaData('ITK_original_direction')等运行它们。这就是这里的问题。SimpleTk不读取头信息。在发布到堆栈上之前,我首先尝试了您的方法,但它只返回一个关于使用MetaImageIO读取的元数据键,其他什么都没有。这真的很奇怪。我有5个可用的元数据密钥。你用什么来写mha文件?我想知道这是否与SimpleTk编写并识别的内容的格式有关。NIFTI文件格式或人类可读的MHD文件类型是否适用于您正在尝试的内容?如果没有,可能值得探索直接解析字节,这有点复杂。我试过使用nifti和dicom,它在那里工作,就像你描述的那样,但使用mha或mhd,我就是无法让它工作。也许我有一个奇怪的数据集。我试图直接解析字节,但我想出或找到的每一种方法都包括读取所有图像数据,由于性能原因,这是次优的(它将用于读取许多系列图像)