1 数据表达
ITK 中有两种基本的数据表示类型:图像和网格。这个功能是在类 Image 和 Mesh 中实现的,这两个类都是 itk::DataObject 的子类。在 ITK 中,数据对象是那些分送系统和参与数据流管道的类。
itk::Image 表示一个 n 维、规则的样品数据。采样方向平行于任一个坐标轴,采样起点、像素间隔和每个方向上的样品数量(如图像维数)是特定的。这个样品或像素在 ITK 中的类型是任意的,一个模板参数 TPixel 指定了模板实例的类型(当对图像类实例化时图像的维也必须指定)。如果要在所有情况下编译代码(例如使用这些操作通过特定的滤波器来进行处理),关键就是像素的类型必须支持这些操作(如加法和减法)。在实际中 ITK 用户通常使用 C++中的简单类型(如整型、浮点型)或预定义像素类型而很少创建新的像素类型。
ITK 中关于图像的一个重要概念是区域 regions,它是一个矩形的、连续的图像块。区域用来指定图像中处理的部分,例如多线程或保留在内存中的部分。在 ITK 中有三种常用的区域类型:
(1) LargestPossibleRegion——全部图像。
(2) BufferedRegion——保留在内存中的图像部分。
(3) RequestedRegion——对图像操作时滤波器或其他类需要的部分。
网格类表示一个 n 维无结构的格子。 网格类的拓扑布局是由一套单元(cells) 来表示的,单元(cells)是由一个类型和连通性列表来定义的;这个连通性列表依次涉及点(points)。
网格的几何结构是通过 n 维的点(points)组合相关的单元插补函数来定义的。网格设计为一个自适应表达结构,按照在其上实行的操作来进行改变。表达一个网格最起码是需要点和单元的; 但是也可以增加额外的拓扑信息。 例如, 通过增加每个点的信息来把点链接到单元;这提供了在假定暗含的拓扑结构正是所需要的结构情况下的邻域信息。 它同样也可以明确地指定边界单元、从暗含的邻域关系来表示不同的连通性和储存单元边界的信息。
网格以三个模板参数的形式来定义:
(1) 和点、 单元和单元边界相关联的一个像素类型;
(2) 点的维数(依次限制了单元的最大维);
(3) 一个网格特征模板参数,指定了用来储存点、单元、边界的容器和迭代器的类型。通过谨慎使用网格特征,可以在允许表达复杂性、存储器和速度之间的一个平衡的条件下,创建更适合于编辑或者更适合于只读操作的网格。
网格是 itk::pointSet 的一个子类。点集类可以用来表示云点和随意分布的特征点等。点集类和拓扑结构无关。