• 【Python】SimpleITK使用笔记


    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()) 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    2.1 读取和保存图像

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

    读取图像

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

    保存图像

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

    像素类型

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

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

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    因为在训练时一般是[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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

  • 相关阅读:
    Linux文件操作及原理详解
    Android设计模式-享元模式
    计算机毕业设计ssm基于JAVA的在线考试系统设计78084系统+程序+源码+lw+远程部署
    基于PHP+MySQL的服装购物商城系统#毕业设计
    Manjaro如果yay使用了aur的清华源,出现报错,解决方法
    贤鱼的刷题日常(数据结构栈学习)--P1175 表达式的转换--题目详解
    压缩上传的图片并返回图片路径
    layui select多选下拉显示 以及多值回显
    Nim游戏
    软考高级-系统架构师-案例分析-架构设计真题考点汇总
  • 原文地址:https://blog.csdn.net/See_Star/article/details/127764476