常见的医学影像数据格式及其读取与保存
Posted Paul-Huang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常见的医学影像数据格式及其读取与保存相关的知识,希望对你有一定的参考价值。
常见的医学影像数据格式及其读取与保存
1. 医学图像
-
医学图像是反映解剖区域内部结构或内部功能的图像,它是由一组图像元素——像素(2D) 或立体像素(3D) 组成的。医学图像是由采样或重建产生的离散性图像表征,它能将数值映射到不同的空间位置上。像素的数量是用来描述某一成像设备下的医学成像的,同时也是描述解剖及其功能细节的一种表达方式。像素所表达的具体数值是由成像设备、成像协议、影像重建以及后期加工所决定的。
-
医学图像有四个关键成分—— 图 像 深 度 、 光 度 表 示 、 元 数 据 和 像 素 数 据 \\colorred图像深度、光度表示、元数据和像素数据 图像深度、光度表示、元数据和像素数据。这些成分与图像大小和图像分辨率有关
- 图 像 深 度 \\colorred图像深度 图像深度(又称比特深度或颜色深度)是用来编码每个像素信息的比特数。比如说,一个8比特的光栅可以有256个从0到255数值不等的图像深度。
-
光
度
表
示
\\colorred光度表示
光度表示解释了像素数据如何以正确的图像格式(单色或彩色图片)显示。为了说明像素数值中是否存在色彩信息,我们将引入“每像素采样数”的概念。
- 单色图像只有一个“每像素采样”,而且图像中没有色彩信息。图像是依靠由黑到白的灰阶来显示的,灰阶的数目很明显取决于用来储存样本的比特数。在这里,灰阶数与像素深度是一致的。
- 医疗放射图像,比如CT图像和磁共振(MR)图像,是一个灰阶的“光度表示”。而核医学图像,比如正电子发射断层图像(PET)和单光子发射断层图像(SPECT),通常都是以彩色映射或调色板来显示的。
-
元 数 据 \\colorred元数据 元数据是用于描述图像的信息。它可能看起来会比较奇怪,但是在任何一个文件格式中,除了像素数据之外,图像还有一些其他的相关信息。这样的图像信息被称为“元数据”,它通常以“数据头”的格式被储存在文件的开头,涵盖了图像矩阵维度、空间分辨率、像素深度和光度表示等信息。
-
像 素 数 据 \\colorred像素数据 像素数据是储存像素数值的位置。根据数据类型的不同,像素数据使用数值显示所需的最小字节数,以整点或浮点数的格式储存
图像大小 = 数据头大小(包括元数据) + 行数 × 栏数 × 像素深度(图像帧数) (1.1) \\text图像大小 = \\text数据头大小(包括元数据) + \\text行数\\times\\text栏数\\times\\text像素深度(图像帧数)\\tag1.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]
参考
以上是关于常见的医学影像数据格式及其读取与保存的主要内容,如果未能解决你的问题,请参考以下文章