今年 3 月,英伟达的 GTC 2017 大会上展示了很多深度学习技术在医疗领域中的卓越工作。Ian GoodFellow、Jeremy Howard 以及其他的深度学习专家都分享了他们对深度学习的见解。顶尖的医科学校(例如西奈山医院、纽约大学、麻省综合医院等)以及肺癌 BOWL 的获奖者 Kaggle 一起解释了他们的建模策略。回顾我们的系列文章,在上一篇文章中,我们讨论了在文本和图像数据上的基础深度学习。在本文中,我们会聚焦于分析医疗图像和它们的格式。
这篇文章由三部分组成–医疗图像和组成、医疗图像格式,以及医疗图像格式的转换。本文的目标就是组织知识来帮助我们实现最终目标–用深度学习进行医疗图形的分析。
医疗图像和组成
与这个主题相关的一个很好的资源来自意大利生物组织和生物图像研究所(IBB)的 Michele Larobina 和 Loredana Murino 发表的论文。这个研究所是意大利国家研究委员会(NCR)的一部分。它是意大利最大的公共研究机构。另一个可供参考的资源是这篇论文:「Working with the DICOM and NIfTI Data Standards in R」
那么,医疗图像是什么呢?医疗图像是对解剖区域的内部结构和功能的一种表征。它以二维像素或者三维体素的形式呈现出来。映射到空间位置的数值是对采样过程和重建过程的离散表征。用来描述一个确定采样模态视野的像素数量是对解剖结构和功能的细节的表达。像素表达的数值取决于成像模式、采样协议、重建以及后续处理过程。
医疗数据的组成
医疗数据的组成
如图所示:医疗数据有四个关键的组成部分–像素深度、光度解释、元数据以及像素数据。这几部分决定了图像的大小和分辨率。
像素深度(Pixel Depth)或者位深度(Bit Depth)或者色深度(Color Depth)就是用来编码每一像素的信息所用的位数。例如,一个 8 位的栅格会拥有从 0 到 255 这 256 种各不相同的数值。
参考:http://desktop.arcgis.com/en/arcmap/10.3/manage-data/raster-and-images/bit-depth-capacity-for-raster-dataset-cells.htm
光度解释具体化了像素数据被解释成正确的图片展示的方式,如单色图像或者彩色图像。为了确定像素值中是否存储了彩色信息,我们引入了每个像素的样本的概念,也就是大家都知道的通道数量。单色图像每个像素只有一个样本,图片中并没有存储彩色信息。我们使用从黑色到白色的灰度级别来展示这种图片。灰度的数量明显取决于用来存储这个样本的位数,在这种情况下,与像素深度是一致的。像 X 光片、CT 和磁共振这样的放射医疗影像都有一个灰度光度解释。核医学图像都以彩色的形式展现,例如 PET 和 SPECT。
元数据就是图片中所描述的信息。它看上去可能是很奇怪的,但是无论在什么格式的文件中,都存在一些超越像素数据并且和图像相关的信息。这类被称作元数据的信息通常都以头部的形式储在文件的起始部分,它至少会包含以下信息:图像矩阵的维度、空间精度、像素深度以及光度解释。
像素数据–这里存储的是像素数值的大小。根据不同的数据类型,像素数据可能以整型或者浮点型的类型存储,使用表达数据所需的最少的数据位。
所以,图像的大小=头部大小(包含元数据)+行×列×像素深度×帧的数量
医疗图像的格式
放射生物图像中主要有六种格式–DICOM(医疗中的数字图像和通信),NIFTI(神经影像学信息技术计划),PAR/REC(飞利浦 MRI 扫描格式),ANALYZE(Mayo 医疗成像)以及 NRRD(近乎原始光栅数据)和 MNIC 格式。
截止 2017 年 5 月的医疗图像格式
其中 DICOM 和 NIFTI 是最常用的格式。
DICOM 格式的基本知识
DICOM 代表的是医疗数字成像和通信。DICOM 是由美国国家电气制造商协会(NEMA)制定的标准。它定义了医疗成像领域中关于信息处理、存储、打印以及传输的标准。这些都是你在扫描仪或者某家医院的图片归档和通信系统(PACS)能够立即得到的文件格式。
它包括了文件格式和能够接收图像和 DICOM 格式的病人数据的实体之间使用 TCP/IP 进行通信的协议。
一个 DICOM 文件包含文件头部和同文件名的*.dcm 图像数据。文件头部的大小取决于它所提供的信息的多少。文件头包含以下信息:病人的 ID,病人的姓名,图像的模态以及其他信息。它定义了帧的数量以及图像的精度。这些信息会被图像浏览器在显示图像时用到。对于一个单词采样,会有很多个 DICOM 文件。
来源:https://www.leadtools.com/sdk/medical/dicom-spec1
pydicom 是一个读取 dicom 文件的 python 库。可以参考本文第一部分的示例代码。
用深度学习的方法进行医疗图像分析
深度学习可以分析图像和视频,并将分析结果用于很多种应用中,例如无人驾驶……
oro.dicom 是一个可以读取 dicom 数据的 R 语言包。
上图所示是用 oro.dicom 包来读取一个已经解压了的 DICOM 文件。
NIFTI 格式基本知识
Nifti 格式最初是为神经影像学发明的。神经影像信息学技术计划(NIFTI)将 NIfTI 格式预设为 ANALYZE7.5 格式的替代品。它最初的应用领域是神经影像,但是也被用在其他领域。这种格式的主要特点就是它包含两个能够将每个体素的索引(i,j,k)和它的空间位置(x,y,z)关联起来的仿射坐标。
nibabel 是一个能够读取 nifti 文件的 Python 库,oro.nifti 是一个能够读取 nifti 文件的 R 语言库。
DICOM 和 NIFTI 的区别
DICOM 和 NIfTI 这两种格式的主要区别是:NIfTI 中的图像原始数据被存储成了 3 维图像,而 dicom 一些 2 维的图层。这就使得 NIFTI 更加适合那些应用在 DICOM 上的机器学习的方法,因为它是以 3D 图像建模的。处理一个单独的 NIFTI 文件要比处理成百上千个 dicom 文件更加容易一些。与 DICOM 格式下的好多个文件相比,NIFTI 格式下,每个 3d 图像只有两个文件。
Nrrd 格式的基本知识
灵活的 Nrrd 格式包含一个单独的头文件和若干个可以被结合在一起或者分开的图像文件。Nrrd 头文件为科学可视化和图像处理准确地表征了 N 维光栅信息。国家医疗图像计算联盟(NA-MIC)开发了一种使用 NRRD 格式来表征扩散加权图像(DWI)体积和扩散张量图像(DTI)的方法。为了目视确认张量的方向和期望的神经解剖学的结构一致,Nrrd DWI 和 Nrrd DTI 数据能够被读取为 3D 切片。
通用的 NRRD 文件格式(包括数据和文件头):
参考: http://teem.sourceforge.net/nrrd/format.html#general.1
MINC 格式的基本知识
MINS 代表的是医疗图像 NetCDF 工具包。
Minc2 从 NetCDF 变换成了 HDF5。HDF5 支持无限制多的数据类型,并且它就是为灵活高效的 I/O 和大容量的复杂数据而设计的。这些附加的特征有助于 Minc2 处理大量的复杂数据集。
从研究论文中得到的一些关于这几个格式的对比:
参考:Medical Image Formats, Springer Publication 2014. 医疗图像格式
格式转换
dicom 转换成 NIFTI
dicom2nii(https://www.nitrc.org/projects/dcm2nii/)是一个用来把 DICOM 转换为 NIFTI 的工具。nibabel 是一个读写 nifiti 文件的 python 库。如果你你想把 DICOM 转换成 NIFTI,可以使用自动转换的工具(例如,dcm2nii)。python2 下的库 dcmstack 可以将一系列的 DICOM 文件堆叠成多维数组。这些数组能够被写成 NIFTI 的文件,同时还加上一个可选的头部扩展,这个头文件包含原始 DICOM 文件的所有元数据。python3 提供了一个新的用来完成这个格式转换的库–dicom2nifti。我建议读者去查看一下 nipy 这个项目。
DICOM 到 MINC 的转换
脑成像中心(BIC)的 MINC 团队开发了将 DICOM 转换为 MINC 格式的工具。这个工具是用 C 语言开发的,它在 GitHub 上的地址为:https://github.com/BIC-MNI/minc-tools/tree/master/conversion/dcm2mnc
NIfTI 或 ANALYZE 转换成 MINC
脑成像中心(BIC)的 MINC 团队还开发了将 NIfTI 或 ANALYZE 转换成 MINC 格式图像的工具。这个程序叫做 nii2mnc。包括 nii2mnc 的很多格式转换工具在这里可以看到:https://github.com/BIC-MNI/minc-tools/tree/master/conversion。
总结
我们可以看到,目前已存在几种用于存储医疗图像并且可以用在深度学习中的文件格式。我们的目标是使用最佳的文件格式,该格式能够让我们得到卷积神经网络(CNN)所需的所有特征,以实现准确的预测。