Python医学图像处理:理论学习和nii图像预处理

学习目录

  • 医疗图像
    • 像素深度
    • 光度学解释
    • 元数据
    • 像素数据
  • 医疗图像格式
    • DICOM格式
    • NIFTI 格式
    • NRRD 格式
    • MINC格式
    • 格式转换
  • nii文件预处理
    • SimpleITK
    • Matplotlib
      • Plt.imshow()与plt.show()区别
      • Backends
    • Nibabel
  • 医学图像处理库
    • PyMVPA
    • Nilearn
    • Scikit-learn
    • Scikit-image
    • PyOpenCV(或CV2)
    • PyOpenGL
    • PIL
    • FSL
    • FreeSurfer
    • Slicer
    • nipy,nibabel
    • VTK
  • 机器学习开源

医疗图像

医学图像有4个关键要素:像素深度,光度学解释,元数据和像素数据。 这些组成部分负责图像的大小和分辨率。1

像素深度

像素深度或位深度或颜色深度是用于编码每个像素的信息的位数。 例如,8位栅格可以具有256个唯一值,范围从0到255。

光度学解释

光度学解释指定如何将像素数据解释为正确的图像,显示为单色或彩色图像。为了指定颜色信息是否存储在图像像素值中,我们引入了每像素采样的概念,也称为通道数。单色图像每个像素具有一个样本,并且图像中不存储颜色信息。从黑色到白色的灰度阴影的比例用于显示图像。灰度的数量明显取决于用于存储样本的比特数,在这种情况下,与像素深度一致。临床放射图像,如X射线计算机断层扫描(CT)和磁共振(MR)图像具有灰度光度解释。核医学图像,如正电子发射断层扫描(PET)和单光子发射断层扫描(SPECT),通常用彩色图或调色板显示。

元数据

元数据是用来描述图像的信息。这看起来很奇怪,但在任何文件格式中,总是存在与像素数据之外的图像相关联的信息。这种称为元数据的信息通常作为标题存储在文件的开头,并至少包含图像矩阵尺寸,空间分辨率,像素深度与那数据和光度学解释。

像素数据

这是存储像素数值的部分。根据数据类型,像素数据存储为整数或使用表示值所需的最小字节数的浮点数。
图像大小=标题大小(包括元数据)+行*列*像素深度*(帧数)

行和列应该属于元数据中的矩阵尺寸。

一帧就是一副静止的画面,连续的帧就形成动画,如电影等。我们通常所说的帧数就是在秒钟时间里传输的图片的帧数,通常用fpsFrames Per Second)表示。每一帧都是静止的图像,快速连续地显示帧便形成了运动的假象,还原了物体当时的状态。高帧率可以得到更流畅、更逼真的动画。每秒钟帧数(fps)愈多,所显示的动作就会愈流畅。一般来说,图像帧率设置为25fps30fps已经足够。

视频分辨率是指视频成像产品所成图像的大小或尺寸,它的表达式为:“水平像素数*垂直像素数”。常见的图像分辨率有QCIF(176×144)、CIFDPP1920*1080)。摄像机成像的最大分辨率是由CCD或CMOS感光器件决定的。现在有些摄像机支持修改分辨率,是通过摄像机自带软件裁剪原始图像生成的。

医疗图像格式

放射学图像有6种主要格式:
DICOM(医学数字成像和通信)
NIFTI(神经影像信息技术)
PAR / REC(飞利浦MRI扫描仪格式)
ANALYZE(梅奥医学影像)
NRRD(近原始光栅数据)
MNIC。
在以上五种格式中,DICOM和NIFTI是实用最广的。

DICOM格式

DICOM代表医学数字成像和通信。 DICOM是由美国国家电气制造商协会(NEMA)制定的标准。它定义了在医学成像中处理,存储,打印和传输信息的标准。
DICOM文件由标题和同一文件(* .dcm)中的图像数据组成。标题的大小取决于提供的标题信息量。标题包含诸如患者ID,患者姓名,模态和其他信息的信息。它还定义了包含多少帧以及哪些分辨率。图像查看器使用它来显示图像。对于单次采集,将会有很多DICOM文件。
Python医学图像处理:理论学习和nii图像预处理_第1张图片
读取dicom文件的python库是pydicom。

NIFTI 格式

最初是为神经影像而创作的,除了应用在神经成像领域,也可以用于其他领域。 主要特征是格式包含两个仿射坐标定义,其将每个体素索引(i,j,k)与空间位置(x,y,z)相关联。

读取nifti文件的python库是nibabel。 用于读取nifti数据的R包是“oro.nifti”。

DICOM和NIFTI之间的差异
DICOM和NIfTI之间的主要区别在于NIfTI中的原始图像数据被保存为3d图像,在DICOM中有2d图像切片。 这使得NIFTI比DICOM的某些机器学习应用更受欢迎,因为它被建模为3d图像。 处理单个NIFTI文件比起处理数百个DICOM更容易实现。 Nifti每个3d图像存储2个文件,而DICOM则存储数十个文件。

NRRD 格式

灵活的NRRD格式包括单个头文件和可以分开或组合的图像文件。NRRD标题准确地表示用于科学可视化和医学图像处理的N维光栅信息。 全国医学图像计算联盟(NA-MIC)开发了一种使用NRRD格式表示扩散加权图像(DWI)体积和扩散张量图像(DTI)的方法。NRRD DWI和NRRD DTI数据可以读入3D切片器,在视觉上确认张量的方向与预期的神经解剖学一致。

MINC格式

MINC代表医学影像NetCDF工具包。
Minc2从NetCDF切换到分层数据格式版本5(HDF5)。 HDF5支持无限种类的数据类型,专为灵活高效的I / O以及大容量和复杂数据而设计。 这些新增功能帮助Minc2处理大型复杂数据集。

格式转换

将DICOM转换为NIfTI的流行工具是dicom2nii。 读取和写入nifti文件的python库是nibabel。 如果想将DICOM转换为Nifti,可以使用自动转换工具(例如dcm2nii)。
Python 2库“dcmstack”允许将一系列DICOM图像堆叠成多维数组。这些数组可以写为Nifti文件,带有可选的标题扩展名(DcmMeta扩展名),其中包含源DICOM文件中所有元数据的摘要。Python 3提供了一个较新的库dicom2nifti。建议查看nipy项目。

nii文件预处理

了解nii格式先了解Analyze格式。
Analyze格式储存的每组数据组包含2个文件,一个为数据文件,其扩展名为.img,包含二进制的图像资料;另外一个为头文件,扩展名为.hdr,包含图像的元数据。

在fMRI(功能磁共振成像技术)的早期,Analyze格式最常用的格式,但现在逐渐被NIFTI格式所取代。Analyze格式主要不足就是头文件不能真正反映元数据。

标准NIFTI图像的扩展名是.nii,也包含了头文件及图像资料。由于NIFTI格式和Analyze格式的关系,因此NIFTI格式也可使用独立的图像文件(.img)和头文件(.hdr)。

单独的.nii格式文件的优势就是可以使用标准的压缩软件(如gzip)进行压缩,而且一些分析软件包(比如FSL)可以直接读取和写入压缩的.nii文件(扩展名为.nii.gz)

关于NIFTI格式的专业说明
https://brainder.org/2012/09/23/the-nifti-file-format/
https://blog.csdn.net/DoronLee/article/details/78597868

SimpleITK

  1. pycharm库导入报错
    Python医学图像处理:理论学习和nii图像预处理_第2张图片
    解决方法参考:https://blog.csdn.net/Crazy__1/article/details/105076638
    Python医学图像处理:理论学习和nii图像预处理_第3张图片

Matplotlib

Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形 。通过 Matplotlib,开发者可以仅需要几行代码,便可以生成绘图,直方图,功率谱,条形图,错误图,散点图等。简单的说就是把数据显示成图形用的,比如曲线,棒图,饼图,总之就是数据可视化。

方法 说明
figure() 创建画布有返回值,重要参数dpi分辨率,figsize画布大小
xlabel(),ylabel() 通过plt.ylabel(‘纵轴名’)指定轴的名称
plot() 线形图
axis() 参数是 [xmin, xmax, ymin, ymax] 列表作为参数来指定了各个轴的视口大小
show() 展示方法,展示之后会清空内存中图片,因此要先保存图片再show
savefig() 保存图片参数是保存路径和文件名
legend() 函数主要的作用就是给图加上图例,plt.legend([x,y,z])里面的参数使用的是list的的形式将图表的的名称喂给这和函数
plt.xticks(bins) xticks(list) 使用list的值进行 x 轴刻度的标识
title() 标题
grid() 设置为true添加网图格plt.grid(True, linestyle=’–’, alpha=0.5)

Plt.imshow()与plt.show()区别

plt.imshow()函数负责对图像进行处理,并显示其格式,但是不能显示。
其后跟着plt.show()才能显示出来。

Backends

matplotlib针对许多不同的用例和输出格式:有些人从python shell交互使用matplotlib,并在键入命令时弹出绘图窗口;有些人将matplotlib嵌入到图形用户界面(如wxpython或pygtk)中以构建丰富的应用程序;其他人在批处理脚本中使用matplotlib从一些数值模拟生成postscript图像;还有一些在Web应用程序服务器中生成posts动画以动态提供图形。 为了支持所有这些用例,matplotlib可以针对不同的输出,并且这些功能中的每一个都称为后端。“前端”是面向用户的代码,即绘图代码;而“后端”完成幕后的所有艰苦工作以制作图形。有两种类型的后端:用户界面后端和硬拷贝后端来制作图像文件(PNG,SVG,PDF,PS)。

如果使用use()函数,则必须在导入matplotlib.pyplot之前完成此操作。导入pyplot后调用use()将不起作用。如果用户想要使用不同的后端,则使用use()将需要更改代码。因此,除非绝对必要,否则应避免显式调用use()。

Nibabel

1.图像导入,使用的是压缩格式

import nibabel as nib
import matplotlib.pyplot as plt
import numpy as np
import os

# nifti file load
def read_nii_file1(nii_path):
    '''
    根据路径读取文件
    '''
    nii_img=nib.load(nii_path)
    # 可以获取很多信息包括shape,仿射值,数据类型和矩阵
    # print(nii_img)
    # load的包的数据类型 
    # print(type(nii_img))
    print(nii_img.shape)
    # (611, 512, 512)
    return nii_img

2.提取其中一片与运行

def nii_one_slice1(image):
    '''
    显示nii image中的其中一张slice
    '''
    # 获取数据矩阵,使用该函数获取的格式是numpy格式
    # get_data()将被弃用,使用get_fdata()来获取数据
    image_arr=image.get_fdata()
    # 打印矩阵类型
    print(type(image_arr))
    # 查看图像的长宽高 发现和nifti包的shape是一样的(611, 512, 512)
    # 注意:nibabel读出的image的data的数组顺序为:Width,Height,Channel
    print(image_arr.shape)
    # 将2d数组转置,就是调换xy的位置
    # image_2d = image_arr[0,:,:].transpose((1, 0))
    # 当然也可以不调换
    image_2d = image_arr[0, :, :]
    plt.imshow(image_2d, cmap='gray')
    plt.show()

nii_image1 = read_nii_file1('imaging.nii.gz')
nii_one_slice1(nii_image1)

3.获取和处理仿射矩阵

# 获取放射矩阵,仿射矩阵是对图像实现仿射变换的矩阵,仿射变化包括平移、放缩、旋转
# 3D图像的仿射矩阵大小为4*4,最后一行固定为[0,0,0,1]不起作用
print(nii_image1.affine.shape)
print(nii_image1.affine)

# 第4列控制平移变换,主对角线控制放缩变换,affine[:3,:3]控制旋转变换

医学图像处理库

PyMVPA

PyMVPA(Python MultiVariate Pattern Analysis)是一个用来简化大型数据集的模式分类分析的Python模块。

Nilearn

Nilearn是一个能够快速统计学习神经影像数据的Python模块。它利用Python语言中的scikit-learn工具箱和一些进行预测建模,分类,解码,连通性分析的应用程序来进行多元的统计。

Scikit-learn

Scikit-learn是基于Scipy为机器学习建造的的一个Python模块,它的特色就是多样化的分类,回归和聚类的算法包括支持向量机,逻辑回归,朴素贝叶斯分类器,随机森林,Gradient Boosting,聚类算法和DBSCAN等。

Scikit-learn需要Numpy和Scipy等其他包的支持,因此在安装Scikit-learn之前需要提前安装一些支持包。

Scikit-image

Scikit-image是用于图像处理的Python包,使用原生的NumPy数组作为图像对象。

PyOpenCV(或CV2)

PyOpenCV(或CV2)是一个用Python实现的OpenCV的API。

PyOpenGL

PyOpenGL是一个用Python实现的OpenGL的API。

PIL

PIL(Python Imaging Library)是Python中最常用图像处理库,它的功能非常强大,并且API非常简单易用。

FSL

FSL和AFNI以及SPM一样,是一款常用的神经影像数据处理软件。目前FSL已经出到6.0版本,我们可以通过FSL的官网来学习如何安装和使用FSL。

FreeSurfer

FreeSurfer是一个处理大脑3D结构像数据,进行自动皮层和皮下核团分割的软件。该软件是一款用于分析脑神经数据的工具集合,它提供了一系列的算法来量化人脑的功能、连接以及结构属性,能对高分辨率的磁共振图像进行三维重建,生成展平或胀平图像,并能得到皮质厚度、面积、灰质容积等解剖参数。

Slicer

3D Slicer是一个跨平台的,免费和开源的数据可视化和医学图像计算软件包。

nipy,nibabel

Python医疗影像开发包。

VTK

VTK(visualization toolkit)是一个开源的免费软件系统,主要用于三维计算机图形学、图像处理和可视化。

机器学习开源

https://cloud.tencent.com/developer/article/1465661


  1. https://zhuanlan.zhihu.com/p/68538289 ↩︎

你可能感兴趣的:(机器学习:医疗图像处理,机器学习,python)