本文由Markdown语法编辑器编辑完成.
1. 背景:
在上一篇文章中,已经介绍了.mha格式的体数据文件,在医学影像软件中的应用,即,它可以将一个序列内所有的dicom内的PixelData, 都集成到一个文件中.
这对于后续的读取是一个很大的帮助.因为计算机在读取一个整块的.mha大文件(几百MB)的速度,要远远高于读取很多很多小(一张512*512的CT dicom图像是500KB左右)的文件.
但是,.mha文件由于主要保存的像素信息,因此它包含的其他信息很少,比如DICOM文件中,一般会包含几百个不同的tag, 记录了这张dicom的各种参数,比如患者信息,检查描述,检查号,拍摄日期和时间,扫描协议,拍摄方位等等.
这些信息,对于后处理有很大的帮助.
因此,如果我们可以直接从.mha文件中来读取出这些tag信息,那么就极大地简化了一些处理逻辑.于是,我们这篇文章,主要就是要解决,如何与.mha文件进行交互,存储和读取其他tag信息.
2. 方法介绍:
2.1 .mha元信息
在之前的博文中,已经写过如果利用simpleITK, 来生成一个包含一个序列内全部像素信息的.mha文件。这里不再赘述。
假设我们已经有一个之前生成好的.mha文件。那么我们首先读取这个.mha文件,看看它除了体数据,还有哪些信息。
以下是一段, 基于SimpleITK读取一个已经存在.mha的文件,并且读取它已知的元信息的代码.
import SimpleITK as sitk
image = sitk.ReadImage("test.mha")
image.GetMetaDataKeys()
它的输出结果为:
('ITK_InputFilterName', 'ITK_original_direction', 'ITK_original_spacing')
然后读取这几个Key值时,输出的结果却是UNKNOWN_PRINT_CHARACTERISTICS.
image.GetMetaData("ITK_original_direction")
'[UNKNOWN_PRINT_CHARACTERISTICS]\n'
从这里可以看出,虽然.mha文件,虽然有默认的几个元信息的key. 但如果不提前赋值的话,也是读取不到结果的。
2.2 为.mha提前写入元信息
既然可以从.mha中,读出默认的一些key. 那么我们也可以在生成.mha之后,将一些未来需要使用的key值,提前写入到.mha文件中,比如PatientID, AccessionNumer等。
以下是一个测试代码:
import SimpleITK as sitk
image = sitk.ReadImage("test.mha")
image.SetMetaData("PatientID", "123456")
modify_mha_file = "modify.mha"
sitk.WriteImage(image, modify_mha_file)
image2 = sitk.ReadImage(modify_mha_file)
image2.GetMetaData("PatientID")
通过以上的测试,可以发现,虽然.mha体数据文件,主要是用来保存dicom文件中的像素信息的。
但是如果由于特定的需求,也需要在.mha中,包含一些文本信息。那么,基于SimpleITK的sitk.Image对象提供的SetMetaData(), GetMetaData()接口,通过设置key, value的方式,写入和读出包含在.mha文件中的元信息。