1. 概念

1.1 nii格式
nii 格式是保存医学图像非常重要一种格式,nii 格式就是后缀名为 .nii .nii.gz 的文件,该格式又叫 NIfTI-1。核磁共振成像(MRI)或者CT图像通常会以这种格式保存。详见

这种格式的作用,简单来理解就是将索引坐标映射到体素坐标。在nii格式中,为了将索引坐标(数组下标)映射到体素坐标(空间坐标),除了保存图像的数据外,即一个个离散的像素,还保存了一些额外信息,比如每个像素间的距离,原点坐标,方向等等,这样根据像素间的距离就可以计算某一像素在空间中真正的坐标了。

1.2 SimpleITK
SimpleITK 是专门处理医学影像的软件,是 ITK 的简化接口,使用起来非常便捷,SimpleITK 支持 8 种编程语言,包括c++、Python、R、Java、c#、Lua、Ruby 和 TCL。

1.3 SimpleITK 图像
在 SimpleITK 中,图像的概念与我们在计算机视觉中常用的RGB图像差异很大,后者只是一个多维矩阵,是一个数学上的概念,而在 SimpleITK 中图像是一个物理实体,图像中的每一个像素都是物理空间中的一个点,不光有着像素值,还有坐标、间距、方向等概念。

SimpleITK 图像是多维度的(2D~5D),包含以下元数据

  1. Origin:原点,起始点所在的坐标
  2. Spacing:不同维度像素之间的距离,每个体素之间的距离
  3. Size:不同维度的尺寸
  4. Direction:矩阵每个轴的方向,由于图像未必是正交,所以会用方向向量来指明不同轴的方向。

2. 基本操作

2.1 常见属性
sitk中有以下四种常见的属性,分别可以使用get的方式获取,代码如下所示:

# 获取图像的大小,size为图像的每一个维度的长度,即每个维度像素点的个数
# 读取的顺序为[X, Y, Z], 即先宽度,后高度,再深度,对应的三维医学图像中为:先矢状位,后冠状位,再横断位。
print(image.GetSize()) 

# 获取图像的原点坐标,读取顺序同GetSize()方法
print(image.GetOrigin()) 

# 获取每个维度上像素或体素之间的间距,单位mm,其中对于二维图像是像素,三维图像是体素
# 读取顺序同GetSize()方法, 每个维度可以具有不同的间距,且每个维度不一定是正交的。
print(image.GetSpacing()) 

# 获取图像的方向,即图像坐标系相对世界坐标系的角度,角度采用的是方向余弦矩阵
print(image.GetDirection()) 

2.1 读取和保存图像
SimpleITK 可以读取如 .mhd , .nii, .nrrd等图像数据格式。

读取图像

imagepath = "xxx.mhd"   # 图像路径
image1 = sitk.ReadImage(imagepath)
image2 = sitk.ReadImage(imagepath, sitk.sitkFloat32) # 同时可以指定读取的数据类型

保存图像

writepath = "xxx.mhd"  # 保存图像路径
sitk.WriteImage(image, writepath)

像素类型

在读取图片的时候可以指定像素类型,像素类型表示为枚举类型,下面是部分枚举类型的表

数据类型 含义
sitkUInt8 无符号8位整数
sitkInt8 有符号的8位整数
sitkUInt16 无符号16位整数
sitkInt16 有符号的16位整数
sitkFloat32 32位浮点

2.2 SimpleITK图像数据和Numpy矩阵数据之间的转换

SimpleITK 中,各术语对应如下

Width: 宽度,X轴,矢状面(Sagittal
Height: 高度,Y轴,冠状面(Coronal
Depth: 深度, Z轴,横断面(Axial

SimpleITK图像顺序是x,y,z三个方向的大小;而numpy矩阵的顺序是z,y,x三个方向的大小, 要注意索引位置。

SimpleITK2Numpy

GetArrayFromImage():返回图像数据的副本。然后可以自由地修改数据,因为它对原始SimpleITK图像没有影响。

# sitk image to numpy 
shape_img = image.GetSize() #输出形状为:(Width, Height, Depth),即原始SimpleITK数据的存储形式
print("image size:", shape_img) # image size:(320, 250, 80)

datanp_array = sitk.GetArrayFromImage(image)
print("np_array size:", np_array.shape) # np_array size:(80, 250, 320)

因为在训练时一般是[x, y, z],所以我们在dataset中需要将图像的坐标轴转换一下,即做一个transpose(2, 1, 0)操作。

Numpy2SimpleITK

GetImageFromArray():返回一个SimpleITK图像,原点设置为0,所有维度的间距设置为1,方向余弦矩阵设置为identity,强度数据从numpy数组中复制。在大多数情况下需要设置适当的元数据值。

# numpy data to sitk 
imagesitk_image = sitk.GetImageFromArray(np_array) 

# 转换完成后,设置元数据
sitk_image.SetOrigin(origin)
sitk_image.SetSpacing(spacing)
sitk_image.SetDirection(direction)

参考:
Python中SimpleITK库的常用函数
使用SimpleITK读取、保存、处理nii文件
SimpleITK学习笔记