SimpleITK学习笔记
前言
SimpleITK是专门处理医学影像的软件,是ITK的简化接口,使用起来非常便捷,SimpleITK支持8种编程语言,包括c++、Python、R、Java、c#、Lua、Ruby和TCL。在SimpleITK中,图像的概念与我们在计算机视觉中常用的RGB图像差异很大,后者只是一个多维矩阵,是一个数学上的概念,而在SimpleITK中图像是一个物理实体,图像中的每一个像素都是物理空间中的一个点,不光有着像素值,还有坐标、间距、方向等概念(这些概念我们后续会介绍)。
下面我们用python对SimpleITK库中常用的函数进行举例说明。
在使用SimpleITK库之前,需要将SimpleITK库导入进来,如下
import SimpleITK as sitk
1 sitk中的常见属性值
sitk中有以下四种常见的属性,分别可以使用get的方式获取,代码如下所示:
print(image.GetSize()) #获取图像的大小,size为图像的每一个维度的长度,即每个维度像素点的个数
print(image.GetOrigin()) #获取图像的原点坐标
print(image.GetSpacing()) #获取每个维度上像素或体素之间的间距,单位mm,其中对于二维图像是像素,三维图像是体素
print(image.GetDirection()) #获取图像的方向,即图像坐标系相对世界坐标系的角度,角度采用的是方向余弦矩阵
以二维图像为例,如下图所示,左下图是世界坐标系,右下图是图像坐标系。属性值如下所示:
print(image.GetSize())
(7, 6) #在SimpleITK中,读取的顺序为[X, Y, Z], 即先宽度,后高度,再深度,对应的三维医学图像中为:先矢状位,后冠状位,再横断位。
print(image.GetOrigin())
(60.0, 70.0) #读取顺序同GetSize()方法
print(image.GetSpacing())
(20.0, 30.0) #读取顺序同GetSize()方法, 每个维度可以具有不同的间距,且每个维度不一定是正交的。
print(image.GetDirection())
(1.0, 0.0, 0.0, 1.0)

2 读取和保存图像
SimpleITK可以读取如.mhd , .nii, .nrrd等图像数据格式。
#以读取和保存mhd图像为例
imagepath = "xxx.mhd" #图像路径
writepath = "xxx.mhd" #保存图像路径
image = sitk.ReadImage(imagepath)
sitk.Write(image, writepath)
image1 = sitk.ReadImage(imagepath, sitk.sitkFloat32) #你可以指定读取的数据类型
Note1:图像访问是以x, y, z顺序GetPixel(x,y,z) 或 image[x,y,z], 从0开始索引。
Note2:默认的mask图像类型和默认值为sitkUInt8或标量图像uint8_t, 默认值为0和1,其中1代表的是mask。
3 像素类型
像素类型表示为枚举类型,下面是部分枚举类型的表。
| 数据类型 | 含义 |
|---|---|
| sitkUInt8 | 无符号8位整数 |
| sitkInt8 | 有符号的8位整数 |
| sitkUInt16 | 无符号16位整数 |
| sitkInt16 | 有符号的16位整数 |
| sitkFloat32 | 32位浮点 |
| sitkFloat64 | 64位浮点 |
还有sitkUnknown类型,用于未定义或错误的像素ID,值为-1。
Note:64位整数类型并非在所有的发行版上都可用,如果不可用,则值为sitkUnknown,将图像保存为nii文件,用ITKsnap读取时就会出现的错误如下:

4 SimpleITK图像数据和Numpy矩阵数据之间的转换
般我们会用SimpleITK读取图像,再转换为numpy矩阵格式,这样方便数据的处理。
Note
在SimpleITK中,各术语对应如下
Width: 宽度,X轴,矢状面(Sagittal)
Height: 高度,Y轴,冠状面(Coronal)
Depth: 深度, Z轴,横断面(Axial)
SimpleITK图像顺序是x,y,z三个方向的大小(在第一节中也讲过),而numpy矩阵的顺序是z,y,x三个方向的大小, 要注意索引位置。
举个例子:假设实验用的图片大小为320*250*80,即矢状面(x轴方向)切片数为320,冠状面(y轴方向)切片数为250,横断面(z轴方向)片数为80。
SimpleITK2Numpy:
GetArrayFromImage():返回图像数据的副本。然后可以自由地修改数据,因为它对原始SimpleITK图像没有影响。
# sitk image to numpy
shape_img = image.GetSize() #输出形状为:(Width, Height, Depth),即原始SimpleITK数据的存储形式
print(

本文详细介绍了SimpleITK库在医学影像处理中的应用,包括图像属性、读取保存、像素类型、数据转换、访问操作、重采样、分割、形态学操作和连通域分析。通过实例展示了如何使用Python进行操作,并探讨了图像读取的宽高顺序和重采样方法。此外,还讨论了PIL和OpenCV在图像重采样中的应用。
2万+

被折叠的 条评论
为什么被折叠?



