nii
格式是保存医学图像非常重要一种格式,nii
格式就是后缀名为 .nii
或 .nii.gz
的文件,该格式又叫 NIfTI-1
。核磁共振成像(MRI)或者CT图像通常会以这种格式保存。详见
这种格式的作用,简单来理解就是将索引坐标映射到体素坐标。在nii格式中,为了将索引坐标(数组下标)
映射到体素坐标(空间坐标)
,除了保存图像的数据外,即一个个离散的像素,还保存了一些额外信息,比如每个像素间的距离,原点坐标,方向等等,这样根据像素间的距离就可以计算某一像素在空间中真正的坐标了。
SimpleITK
是专门处理医学影像的软件,是 ITK 的简化接口,使用起来非常便捷,SimpleITK 支持 8 种编程语言,包括c++、Python、R、Java、c#、Lua、Ruby 和 TCL。
在 SimpleITK 中,图像的概念与我们在计算机视觉中常用的RGB图像差异很大,后者只是一个多维矩阵,是一个数学上的概念,而在 SimpleITK 中图像是一个物理实体,图像中的每一个像素都是物理空间中的一个点,不光有着像素值,还有坐标、间距、方向等概念。
SimpleITK 图像是多维度的(2D~5D),包含以下元数据
sitk中有以下四种常见的属性,分别可以使用get的方式获取,代码如下所示:
# 获取图像的大小,size为图像的每一个维度的长度,即每个维度像素点的个数
# 读取的顺序为[X, Y, Z], 即先宽度,后高度,再深度,对应的三维医学图像中为:先矢状位,后冠状位,再横断位。
print(image.GetSize())
# 获取图像的原点坐标,读取顺序同GetSize()方法
print(image.GetOrigin())
# 获取每个维度上像素或体素之间的间距,单位mm,其中对于二维图像是像素,三维图像是体素
# 读取顺序同GetSize()方法, 每个维度可以具有不同的间距,且每个维度不一定是正交的。
print(image.GetSpacing())
# 获取图像的方向,即图像坐标系相对世界坐标系的角度,角度采用的是方向余弦矩阵
print(image.GetDirection())
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位浮点 |
在 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)
TODO
参考:
Python中SimpleITK库的常用函数
使用SimpleITK读取、保存、处理nii文件
SimpleITK学习笔记