常见的医学影像数据格式及其读取与保存

常见的医学影像数据格式及其读取与保存

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. 常见的医学影像数据格式

常见的医学影像数据格式及其读取与保存_第1张图片

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()

常见的医学影像数据格式及其读取与保存_第2张图片

常见的医学影像数据格式及其读取与保存_第3张图片

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张图片

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]

参考

  1. 医学图像了解
  2. 常见的医学影像数据格式
  3. 如何读取NIFTI格式图像(.nii文件)
  4. python numpy 写入、读取 .npz 压缩文件
  5. numpy——.npy和.npz文件

你可能感兴趣的:(医学图像&论文笔记,医学图像,.npz,.nii.gz,数据格式)