SimpleITK图像基础(三)——SimpleITK学习笔记

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

前言

SimpleITK是专门处理医学影像的软件,是ITK的简化接口,使用起来非常便捷,SimpleITK支持8种编程语言,包括c++PythonRJavac#LuaRubyTCL。在SimpleITK中,图像的概念与我们在计算机视觉中常用的RGB图像差异很大,后者只是一个多维矩阵,是一个数学上的概念,而在SimpleITK中图像是一个物理实体,图像中的每一个像素都是物理空间中的一个点,不光有着像素值,还有坐标、间距、方向等概念(这些概念我们后续会介绍)。

下面我们用pythonSimpleITK库中常用的函数进行举例说明。

在使用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.00.01.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:图像访问是以xyz顺序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(
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值