Back to ITK

See Also PACSDCMTKGDCMpydicom

SimpleITK

SimpleITK 是 ITK (Insight Segmentation and Registration Toolkit)的一个简化的开源接口。SimpleITK 图像分析库支持多种编程语言,包括C++、Python、R、Java、c#、Lua、Ruby和Tcl。主要的操作系统(Linux、macOS和Microsoft Windows)都可以使用二进制发行版。

SimpleITK 是 NIH(美国国立卫生研究院)开发的开源软件,其主要目标是使 ITK 库中的算法可以让更多的科学家进行图像分析处理工作,而不管他们的软件开发技能。因此,SimpleITK 接口只公开 ITK 组件最常见的修改算法设置。此外,该库为大多数图像处理过滤器提供了面向对象和过程接口。后者使图像分析工作流具有简洁的语法。该库的第二个目标是通过结合使用SimpleITK库和Python (Jupyter notebook)和R (knitr包)编程语言中的现代工具来促进可复制的图像分析工作流。

软件开发以GitHub为中心,使用fork和pull模型。项目是使用CMake工具构建的,每夜的构建发布到项目的质量仪表板上。

多个医学图像分析应用程序和库将 SimpleITK 作为一个关键的构建块,因为它提供了广泛的图像过滤和图像IO组件,具有用户友好的界面。例如,用于流行的Osirix应用程序的pyOsirix脚本工具,用于从医学成像提取放射体特征的pyradiomics python包,3DSlicer图像分析应用程序,SimpleElastix医学图像注册库,以及用于医学成像的NiftyNet深度学习库。

1. History

SimpleITK的最初开发是由美国国家医学图书馆根据《美国复苏与再投资法案》(ARRA)项目提供资金的,该项目由梅奥诊所(Mayo Clinic)、Kitware公司、爱荷华大学(University of Iowa)和NLM的内部项目合作完成。工具包的第一个主要版本于2017年4月至5月发布。

2013年至2019年期间,SimpleITK开发主要是作为国家医学图书馆与爱荷华大学和莫纳什大学合作的校内研究项目的一部分进行的。自2019年以来,SimpleITK开发主要在国家过敏和传染病研究所的网络基础设施和计算生物学办公室下进行。

2. Fundamental Concepts

https://simpleitk.readthedocs.io/en/master/Documentation/docs/source/fundamentalConcepts.html

SimpleITK 的两个核心基本元素是图像和空间转换。这些组件与它们所表示的 ITK 组件遵循相同的约定。基本的基本概念如下所述。

2.1. Images

ITK中图像的基本原则以及SimpleITK中相应的基本原则是,图像是由占据空间物理区域的网格上的一组点定义的。这与其他许多图像分析库有很大的不同,这些库将图像视为具有两个含义的数组:

  1. 像素/体素间距假定为各向同性
  2. 没有图像在物理空间中的位置概念

SimpleITK图像可以是2D、3D或4D,并且可以是标量、labelmap(带有运行长度编码的标量)、复杂值或具有任意数量的标量通道。图像在物理空间中所占的区域由图像的:

  1. Origin-原点(向量类型)——在体素的世界坐标系统中的位置,所有的索引为零。
  2. Spacing-间距(向量类型)-像素之间的距离沿每个维度。
  3. Size-大小(类向量类型)——每个维中的像素数量。
  4. Direction cosine matrix-方向余弦矩阵(类向量表示矩阵的行主要顺序)-方向的每个轴对应的矩阵列。

以上4个元数据元素的含义入下图所示:

ImageOriginAndSpacing.svg

在下面的Python代码片段中,我们说明了如何创建一个由5浮点通道像素组成的2D图像:origin = (3, 14),spacing = (0.5, 2)。

image = sitk.Image([10,10], sitk.sitkVectorFloat32, 5)
image.SetOrigin((3.0, 14.0))
image.SetSpacing((0.5, 2))

2.2. Channels

如上所述,SimpleITK图像可以具有任意数量的通道,而这些通道的内容是标量或复杂值。这是在创建图像时确定的。

在医学领域,许多图像类型都有一个单一的标量通道(如CT、US)。另一种常见的图像类型是三通道图像,其中每个通道都有[0,255]中的标量值,通常人们将这样的图像称为RGB图像。这个术语意味着这三个通道应该使用RGB颜色空间来解释。在某些情况下,您可以拥有相同的图像类型,但是通道值代表另一个颜色空间,例如HSV(它解耦了颜色和强度信息,并且对光照变化更不变性)。SimpleITK没有颜色空间的概念,因此在这两种情况下,它只是将像素值看作一个3元组。

Word of caution: In some cases looks may be deceiving. Gray scale images are not always stored as a single channel image. In some cases an image that looks like a gray scale image is actually a three channel image with the intensity values repeated in each of the channels. Even worse, some gray scale images can be four channel images with the channels representing RGBA and the alpha channel set to all 255. This can result in a significant waste of memory and computation time. Always become familiar with your data.

2.3. Additional Resources

  1. Doxygen格式的 SimpleITK 图像类 的API。

  2. 为了真正理解 SimpleITK 图像的结构以及如何使用它们,我们建议使用 SimpleITK Jupyter notebooks 进行一些实际操作。

3. Transforms

SimpleITK支持两种类型的空间转换,一种是全局的(无界的)空间域,另一种是有界的空间域。SimpleITK中的点通过转换使用 TransformPoint 方法进行映射。

4. Resampling

正如动词所暗示的,重采样是对图像进行采样的动作,而图像本身就是对原始连续信号的采样。

一般来说,在SimpleITK中重新采样包括四个部分:

  1. 图像-我们重新采样的图像,在坐标系m中给出。
  2. Resampling grid-重采样网格——在坐标系f中给定的点的规则网格,它将被映射到坐标系m。
  3. Transformation-变换T_fm -从坐标系f映射到坐标系m, mp = T_fm(fp)

  4. Interpolator-内插器-从图像定义的点的值中获得m坐标系中任意点的强度值的方法。

SimpleITK提供了大量的插值方法,其中最常用的两种是sitkLinear和sitkNearestNeighbor。前者用于大多数插值任务,是精度和计算效率之间的折衷。后者是用来内插的标记图像代表一个分割。这是唯一不会在结果中引入新标签的插值方法。

SimpleITK接口包含用于指定重新采样网格的三种变体:

  1. 使用与重新采样的图像定义的相同的网格。
  2. 提供定义网格的第二个参考图像。
  3. 指定网格使用:小,原点,间距,方向余弦矩阵。

在物理空间中,在重新采样的图像的空间范围之外映射的点被设置为您提供的常量像素值(默认为零)。

4.1. Common Errors

重新采样后得到一个空的(全黑的)图像并不少见。这是由于:

  1. 为重新采样网格使用错误的设置(不太常见,但确实会发生)。
  2. 用变换T_f^m的逆。这是一个相对常见的错误,可以通过调用转换的GetInverse方法来解决。

4.2. Additional Resources

  1. Doxygen格式的 SimpleITK ResampleImageFilter class 的API。

  2. 为了真正理解 SimpleITK 图像的结构以及如何使用它们,我们建议使用 SimpleITK Jupyter notebooks 进行一些实际操作。

5. Examples

https://simpleitk.readthedocs.io/en/master/Examples/index.html

6. Reference