5、VTK在图像处理中的应用
图像是VTK中一个非常重要的数据。数字图像广泛应用于工业生产、生物医学、媒体娱乐、地质、气象等重要领域,数字图像处理具有重要的应用价值。我们在掌握了VTK的基本知识后,这一章着重讲解数字图像处理相关技术,学完本章你会觉得原来图像处理是如此简单!
5.1 VTK图像数据结构
数字图像文件内容由两个部分组成:图像头信息和数据。图像头信息定义了图像的基本信息,主要包括起点位置(Origin),像素间隔(space)和维数(dimension)。通过这三个参数即可以决定图像空间位置和规模。图像可以看做是空间中的一个规则网格,网格中的每个最小单元称之为一个像素(二维)或者体素(三维),这样网格在每个方向上的像素或者体素个数即为图像在该方向的维数。像素索引表示每个像素在图像网格中的位置,是图像内部的网格坐标。而在医学图像中,每个图像除了内部坐标外,还存在一个世界坐标。这个世界坐标依赖于成像设备。在医学图像中起点位置(Origin),像素间隔(space)和图像维数决定了世界坐标系。这样通过起点位置,像素间隔和像素索引即可计算每个像素的世界坐标位置。
图5.1图像结构和空间表示
如图5.1所示,该图表示一个4x2x3的图像,即图像的维数,每一个小球表示一个像素;而图像的原点为(5.1,10.0,6.5),两两像素之间的间隔表示像素间隔,每个方向的像素间隔为1.5,1.5,和1.8。
图像数据即为图像像素的像素值,一般采用一维数组来表示和存储。已知像素索引和图像维数下,即可计算每个像素对应的像素值。通常图像的像素值为一个标量,例如一般灰度图像;图像像素值也可以是一个向量,例如彩色图像;另外图像像素值还可以是张量,如梯度场图像。医学图像处理中大部分的图像都是灰度图像。
这里需要注意灰度图像的灰度值的数据类型,在一般的灰度图像处理中不需要考虑,因为其范围默认为0-255,可以采用一个unsigned char类型类表示。但是在医学图像处理中,256灰度级远远不能满足要求,因此灰度范围往往大于256级。常见的医学图像的像素数据类型为unsigned short,灰度范围为0-65536。另外,有时为了精度的考虑,也会使用int、float甚至double类型,因此需要格外注意。
通过前面的章节我们已经知道,在VTK中图像数据结构由vtkImageData类表示。利用vtkImageData,我们可以方便的创建、读写、和访问图像数据。下面我们以VTK图像创建为起点,一步步走进VTK图像处理的世界中来。
5.2 VTK图像创建
5.2.1图像源(Source)
VTK中内置了多个创建图像的Source,利用这些Source可以快速的创建图像,其中以vtkImageCanvasSource2D为代表。该Source功能是创建一个画布(空白图像),并提供了多种几何图形(点、线段、圆、矩形以及图像等)的绘制填充功能。下列代码显示了该source的使用方法。
1: vtkSmartPointer<vtkImageCanvasSource2D> canvas =
2: vtkSmartPointer<vtkImageCanvasSource2D>::New();
3: canvas->SetScalarTypeToUnsignedChar();
4: canvas->SetNumberOfScalarComponents(1);
5: canvas->SetExtent(0, 100,0, 100, 0, 0);
6:
7: canvas->SetDrawColor(0, 0,0, 0);
8: canvas->FillBox(0,100,0,100);
9:
10: canvas->SetDrawColor(255,0, 0, 0);
11: canvas->FillBox(20,40,20,40);
12: canvas->Update();
在上面代码片段中,首先定义了一个vtkImageCanvasSource2D的指针,然后设置画布的像素数据类型,像素成分数目和画布的大小。然后,在该画布中,利用FillBox绘制两个填充矩形,并通过SetDrawColor()来设置两个矩形的颜色。
图5.2 vtkImageCanvasSource2D绘图
除了vtkImageCanvasSource2D外,VTK中还提供了其他类似的source类来快速生成特定的图像,例如vtkImageEllipsoidSource,该类根据指定的中心,各个轴的半径来生成一个前景为椭圆(球)的二值图像&#x