离线
|
常见的医学影像数据格式及其读取与保存
1. 医学图像
- 医学图像是反映解剖区域内部结构或内部功能的图像,它是由一组图像元素——像素(2D) 或立体像素(3D) 组成的。医学图像是由采样或重建产生的离散性图像表征,它能将数值映射到不同的空间位置上。像素的数量是用来描述某一成像设备下的医学成像的,同时也是描述解剖及其功能细节的一种表达方式。像素所表达的具体数值是由成像设备、成像协议、影像重建以及后期加工所决定的。
- 医学图像有四个关键成分—— 图 像 深 度 、 光 度 表 示 、 元 数 据 和 像 素 数 据 \color{red}图像深度、光度表示、元数据和像素数据 图像深度、光度表示、元数据和像素数据。这些成分与图像大小和图像分辨率有关
- 图 像 深 度 \color{red}图像深度 图像深度(又称比特深度或颜色深度)是用来编码每个像素信息的比特数。比如说,一个8比特的光栅可以有256个从0到255数值不等的图像深度。
- 光 度 表 示 \color{red}光度表示 光度表示解释了像素数据如何以正确的图像格式(单色或彩色图片)显示。为了说明像素数值中是否存在色彩信息,我们将引入“每像素采样数”的概念。
- 单色图像只有一个“每像素采样”,而且图像中没有色彩信息。图像是依靠由黑到白的灰阶来显示的,灰阶的数目很明显取决于用来储存样本的比特数。在这里,灰阶数与像素深度是一致的。
- 医疗放射图像,比如CT图像和磁共振(MR)图像,是一个灰阶的“光度表示”。而核医学图像,比如正电子发射断层图像(PET)和单光子发射断层图像(SPECT),通常都是以彩色映射或调色板来显示的。
- 元 数 据 \color{red}元数据 元数据是用于描述图像的信息。它可能看起来会比较奇怪,但是在任何一个文件格式中,除了像素数据之外,图像还有一些其他的相关信息。这样的图像信息被称为“元数据”,它通常以“数据头”的格式被储存在文件的开头,涵盖了图像矩阵维度、空间分辨率、像素深度和光度表示等信息。
- 像 素 数 据 \color{red}像素数据 像素数据是储存像素数值的位置。根据数据类型的不同,像素数据使用数值显示所需的最小字节数,以整点或浮点数的格式储存
图像大小 = 数据头大小(包括元数据) + 行数 × 栏数 × 像素深度(图像帧数) (1.1) \text{图像大小} = \text{数据头大小(包括元数据)} + \text{行数}\times\text{栏数}\times\text{像素深度(图像帧数)}\tag{1.1} 图像大小=数据头大小(包括元数据)+行数×栏数×像素深度(图像帧数)(1.1)
2. 常见的医学影像数据格式
2.1 DICOM数据存储格式
- 现今大多MRI仪器采集后的重建数据为DICOM格式。该数据格式源于美国放射学协会(ACR)和国际电子产品制造商协会(NEMA)。DICOM不仅仅是图像的存储格式,而且是不同成像系统的不同形式数据之间转换的模式,MRI图像只是其中一种特殊形式。目前使用的DICOM遵照1993年协议,且目前主要的MRI仪器供应商都支持该格式。
- 通常,DICOM把每一层图像都作为一个独立的文件,这些文件用数字命名从而反映相对应的图像层数(在不同的系统有一定差异)。文件中包含文件头信息,且必须要特定的软件才能打开使用。在所有格式中,DICOM包含了大量的元数据信息在文件头中,包括仪器信息、图像采集参数以及病人信息资料。
- 尽管DICOM是MRI采集的标准输出格式,但是,数据分析前往往要把DICOM格式转化为其他分析格式,这主要是因为DICOM数据比较庞大。由于DICOM把每层图像都存储为独立文件,这会导致产生大量较小的数字文件,从而堵塞文件系统,降低分析速度。有很多免费工具可以把DICOM数据转换为其他存储格式。
2.2 Mosaic数据存储格式
- 有些MRI的脉冲序列(特别是西门子MRI系统)把fMRI的DICOM数据存储为Mosaic格式。这种格式中,每个图像文件中包含1个mosaic文件,而实际是16层的图像。该存储格式就节约了大量的存储空间。大多情况下,仪器生产商宁愿保存为256×256,而fMRI图像的矩阵为64×64。因此,分析前必须解压缩mosaic图像,使之成为三维或四维文件从而符合分析软件需要的格式。
2.3 Analyze数据存储格式
- 最知名的曾使用过的MRI数据格式为Analyze格式,它是由梅奥临床医学中心使用同名的分析软件包而得名(由于费用问题而仅用于fMRI)。
- Analyze格式储存的每组数据组包含2个文件,一个为数据文件,其扩展名为.img,包含二进制的图像资料;另外一个为头文件,扩展名为.hdr,包含图像的元数据。在fMRI的早期,Analyze格式最常用的格式,但现在逐渐被NIfTI格式所取代。
- Analyze格式主要不足就是头文件不能真正反映元数据。
2.4 NIfTI数据存储格式
- 为了减少不同研究中心及数据分析软件共享数据后存在的问题, 2000年美国国家精神研究所、国立神经疾病与脑卒中研究所的研究小组创建了新的数据存储格式。2004年,新的数据格式的第一个版本即NIfTI-1格式发布,它是Analyze 7.5格式的延伸且增加了相当数量的元数据。NIfTI格式最重要的特征就是能反应MRI仪器的像素指数与空间位置。如果使用得当,能帮助我们准确定向,如能帮我们确定哪边代表的是左脑。
- 标准NIfTI图像的扩展名是.nii,包含了头文件及图像资料。由于NIfTI格式和Analyze格式的关系,因此NIfTI格式也可使用独立的图像文件(.img)和头文件(.hdr)。
- 单独的.nii格式文件的优势就是可以用标准的压缩软件(如gzip),而且一些分析软件包(如FSL)可以直接读取和写入压缩的.nii文件(扩展名为.nii.gz)。
3. 读取.nii.gz文件
3.1 读取.nii.gz文件获取三维视角
- import matplotlib
- matplotlib.use('TkAgg')
- from matplotlib import pylab as plt
- import nibabel as nib
- from nibabel.viewers import OrthoSlicer3D
- example_filename = './fixed.nii.gz'
- img = nib.load(example_filename)
- OrthoSlicer3D(img.dataobj).show()
复制代码
3.2 读取.nii.gz文件获取水平切面图
- #查看和显示nii.gz文件
- import matplotlib
- matplotlib.use('TkAgg')
- from matplotlib import pylab as plt
- import nibabel as nib
- example_filename = './fixed.nii.gz'
- img = nib.load(example_filename)
- width, height, queue = img.dataobj.shape
- num = 1
- for i in range(0, queue, 8):
- img_arr = img.dataobj[:, :, i]
- plt.subplot(5, 4, num)
- plt.imshow(img_arr, cmap='gray')
- num += 1
- plt.show()
复制代码
4. .npz文件处理
有些时候,会把图像和标签放入.npz文件中,因此需要对它进行处理。
- 写入npz文件参考文档:https://numpy.org/doc/stable/reference/generated/numpy.savez.html
- 读取npz文件参考文档:https://numpy.org/doc/stable/reference/generated/numpy.load.html
4.1 读取与保存
- 使用np.savez()函数可以将多个数组保存到同一个文件中。
- np.savez()函数的第一个参数是文件名,其后的参数都是需要保存的数组。传递数组时可以使用关键字参数为数组命名,非关键字参数传递的数组会自动起名为arr_0、arr_1……
- np.savez()函数输出的是一个扩展名为.npz的压缩文件,它包含多个与保存的数组对应的npy文件(由save()函数保存),文件名对应数组名
- 读取.npz文件时使用np.load()函数,返回的是一个类似于字典的对象,因此可以通过数组名作为关键字对多个数组进行访问。
- import numpy as np
- # 将多个数组保存到磁盘
- a = np.arange(5)
- b = np.arange(6)
- c = np.arange(7)
- np.savez('test', a, b, c_array=c) # c_array是数组c的命名
- # 读取数组
- data = np.load('test.npz') #类似于字典{‘arr_0’:a,’arr_1’:b,’c_array’:c}
- print('arr_0 : ', data['arr_0'])
- print('arr_1 : ', data['arr_1'])
- print('c_array : ', data['c_array'])
- --------------------------------------------------------------------------------
- arr_0 : [0 1 2 3 4]
- arr_1 : [0 1 2 3 4 5]
- c_array : [0 1 2 3 4 5 6]
复制代码 参考
- 医学图像了解
- 常见的医学影像数据格式
- 如何读取NIFTI格式图像(.nii文件)
- python numpy 写入、读取 .npz 压缩文件
- numpy——.npy和.npz文件
来源:https://blog.csdn.net/huang1024rui/article/details/121449670
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
|