ITK 概述
ITK(Insight Segmentation and Registration Toolkit) 是一个开源,跨平台的图像分析框架,里面有大量的前沿算法,广泛用于图像配准和分割。ITK使用C++开发,可由cmake生成不同环境下的可编译工程,并且ITK有对Tcl,Python和Java的封装层,使得开发者可以使用不同的语言进行开发。
ITK的主要特征有:
1,ITK提供了通用的方式表示图像(任意维度)和面片(非结构化的meshes),提供用于进行分割和配准的算法,主要面向医学应用,尽管也可以处理其他应用;
2,ITK不提供可视化的用户接口,仅提供最小化的文件接口,留由其他库提供;
3,ITK大量使用泛型编程技术;
4,ITK内存模型使用智能指针维护对象的引用计数,使用对象工厂实例化对象;
5,ITK支持多线程并行处理;
6,ITK使用命令/观察者模式进行事件处理;
7,ITK基于数据流的架构进行组织,数据被表示成数据对象(data object),数据对象由处理对象(process object)处理,数据对象和处理对象连在一起形成Pipeline。
8,ITK的开发基于极限编程(extreme programming)原则,设计、实现和维护是快速迭代的过程,而测试是这个过程的核心,每当有文件check in、每晚都会进行不同平台和编译器的测试。
ITK 系统组织
ITK包含几个子系统
Essential System Concepts: ITK中重要的概念包括泛型编程,用于内存管理的智能指针,用于对象实例化的对象工厂,基于command/observer设计模式的事件管理,多线程支持等
Numerics:ITK使用VXL的VNL数值库,这个数值计算库是对用Fortran实现的Netlib数值库的C++封装。
Data Representation and Access:itk::Image 和itk::Mesh是两个用于表示数据的基本类,此外有不同类型的用于存储和遍历数据的迭代器和容器。
Data Processing Pipeline:数据表示类(数据对象,Data Object)被filters(处理对象,Process Object)处理,几个filter可以组织成一条pipeline。Pipeline可以记录并维护数据对象和filter的状态,只有需要的时候才执行响应的filters。ITK的pipeline支持多线程和流式处理。
IO Framework:与pipeline相关的是sources(初始化pipeline的filter),mappers(终止pipeline的filters)。sources和mapper的典型例子是分别是readers和writers,Readers输入数据,writers从pipeline输出数据。
Spatial Objects:ITK中使用spatial 对象层次表示几何形状。这些spatial objects支持解剖结构的建模,使用通用的基本接口,能够以许多不同的方式表示空间区域。Spatial Objects是分割和配准方法中用于保存分割结构和引入解剖先验知识的非常自然的数据结构。
Registration Framework:ITK灵活的配准框架支持不同类型的配准:图像配准,多分辨率配准,基于PDE(偏微分方程)和FEM(有限元方法)的配准。
FEM Framework:ITK包含一个解一般FEM问题的子系统,特别是非刚体配准。ITK中的FEM包包含mesh定义(nodes和elements),加载和边界条件。
Level Set Framework:水平集框架是一系列用于解决偏微分方程的filters。这些filter采用迭代、有限差分更新机制求解偏微分方程。水平集框架包含了稀疏水平集求解器,用于分割的一般水平集的filter和一些特殊的基于阈值,Canny,Laplacian的filters。
Wrapping:ITK使用一种独特而强大的系统产生对解释性语言如Tcl和Python的接口(wrapper)。首先用GCC_XML产生任意复杂C++代码的XML描述,然后用CSWIG将XML转换成wrappers。
Auxiliary/Utilities: 一些辅助的子系统用于对其他部分的补充。例如,calculators是支持filters的特殊操作的类。其他的辅助库包括一个不完全的DICOM解析库,MetaIO文件支持,png,zlib,FLTK/Qt图像浏览器和对VTK(visualization toolkit)的接口。
ITK Pipeline
前面提到ITK中数据对象由处理对象(process object)处理,数据对象和处理对象连在一起形成Pipeline。ITK中的pipeline的示意图如Fig 1。处理对象(filter)根据输入数据为输出的数据对象申请内存并拥有此对象,然后该对象的引用传递给下一个filter处理。
Fig 1 ITK中pipeline示意图
ITK中的pipeline一般按如下步骤创建:
1,确定filter的处理的数据类型;
2,使用filter的静态方法New创建filter的实例;
3,使用filter的方法SetInput(upperstreamfilter->GetOutput)将filter连在一起;
4,设置filter所需的算法参数;
5,触发最后一个filter的Update()方法。