SimpleITK之Image基础
提纲
SimpleITK简介
SimpleITK在Insight Toolkit (ITK)之上构建的简化层,旨在促进其在快速原型设计、教育和解释语言中的使用。SimpleITK作为图像处理和分析的工具包的独特之处在于,它将图像视为物理对象,占用物理空间中的一个有界区域。此外,图像在每个轴上的像素间距可能不同,而且轴不一定是正交的。下图说明了这些概念。
Image的四个要素
- Origin
- Size
- Spacing
- Direction
这些属性是图像的元数据。从图像索引中计算物理坐标需要所有四个组件。以下代码展示了如何读取和设置四个元数据。
import SimpleITK as sitk
import numpy as np
image = sitk.ReadImage(filepath)#filepath是欲读入的一张图片
print('origin: ' + str(image.GetOrigin()))
print('size: ' + str(image.GetSize()))
print('spacing: ' + str(image.GetSpacing()))
print('direction: ' + str(image.GetDirection()))
除了读取,还可以通过一下语句重新设置这些参数
image.SetOrigin((1,1,1))
image.SetSpacing([0.5,0.5,3.0])
SimpleITK和Numpy的转换
SimpleITK和numpy索引访问是相反的顺序!
SimpleITK: image[x,y,z]
numpy: image_numpy_array[z,y,x]
SimpleITK2Numpy:
GetArrayFromImage():返回图像数据的副本。然后可以自由地修改数据,因为它对原始SimpleITK图像没有影响。
GetArrayViewFromImage():返回图像数据的一个视图,该视图对于以内存有效的方式显示非常有用。您不能修改数据,并且如果原始的SimpleITK图像被删除,视图将是无效的。
nda = sitk.GetArrayFromImage(image)
print(image_3D.GetSize())
print(nda.shape)
Numpy2SimpleITK
GetImageFromArray():返回一个SimpleITK图像,原点设置为0,所有维度的间距设置为1,方向余弦矩阵设置为identity。强度数据从numpy数组中复制。在大多数情况下,您需要设置适当的元数据值。
// 创建一个numpy数组
nda = np.zeros((10,20,3))
#以下语句生成的img应该是一个3D灰度图,image [x=3, y=20, z=10]
img = sitk.GetImageFromArray(nda)
print(img.GetSize())
读取DICOM序列
reader = sitk.ImageSeriesReader()
reader.MetaDataDictionaryArrayUpdateOn()#这一步是加载公开的元信息
reader.LoadPrivateTagsOn()#这一步是加载私有的元信息
series_IDs = sitk.ImageSeriesReader.GetGDCMSeriesIDs(directorypath)#根据文件夹获取序列ID,一个文件夹里面通常是一个病人的所有切片,会分为好几个序列
dicom_names = reader.GetGDCMSeriesFileNames( directorypath,series_ID)#选取其中一个序列ID,获得该序列的若干文件名
reader.SetFileNames(dicom_names)#设置文件名
image3D = reader.Execute()#读取dicom序列
访问像素和切片
可以使用GetPixel和SetPixel函数,也可以使用python的切片操作符。
image_3D = sitk.Image(256, 128, 64, sitk.sitkInt16)
print(image_3D.GetPixel(0, 0, 0))
image_3D.SetPixel(0, 0, 0, 1)
print(image_3D.GetPixel(0, 0, 0))
当然也可以通过python的方式来实现
print(image_3D[0,0,1])
image_3D[0,0,1] = 2
print(image_3D[0,0,1])