加急见刊

VTK-Widgets在医学图像交互测量中的研究

佚名  2011-02-08

作者:戴振晖1,张煜1,江贵平1,陈国跃

【摘要】 VTK-Widgets是虚拟场景中响应用户事件的对象。介绍Widget的事件处理机制,并基于Widgets交互式得测量医学图像中感兴趣对象间的距离、对象的角度和面积,此交互测量方法成功应用于三维可视化系统中,有助于医生诊断疾病。

【关键词】 Visualization toolkit(VTK);Widget;测量;医学图像;函数;坐标

1 引 言

通过CT或者MRI获得的医学图像是临床诊断治疗的重要依据,为了从医学图像中获得更多有用的信息,需要对医学图像进行各种变换、测量和标注。对医学图像施加变换的前后需要测量图像内组织的长度、角度和面积,同时对病灶中心等关键区域进行文字标注,以便辅助医生诊断疾病,于是测量工具便成为所有医学图像处理软件中不可缺少的一部分。VTK是Kitware公司开发的集计算机图形、图像处理和可视化于一体的工具开发包,利用VTK可以进行各种测量。

2 Widget的事件处理机制

Widget可以定义为几何学和控制显示对象信息行为的封装,它允许用户直接操作三维数据场中的数据。在VTK中的Widget是由2D的鼠标按键和移动事件控制的,它接收交互器激活的VTK事件并产生相应的行为。Widgets的功能分两步实现,一部分继承于vtkAbstractWidget类,用于事件处理,另一部分继承于vtkWidgetRepresentation类,用于几何特征的描述[1]。

如图1所示,vtkWidgetRepresentation是vtkProp的子类,这说明它就像VTK中的Actor一样可以加到vtkRenderer中,并在场景中显示出来,它与vtkAbstractWidget的某个合适的子类结合产生一个3D Widget。VTK的事件处理系统能够让观察者区分事件的优先顺序,通过他们优先权的设置来跟踪注册顺序,于是使用者可以同时操作多个Widget[2]。本文中介绍的Widget均基于Kitware公司2009年6月发布的最新的5.4.2开发包。

3 距离测量

在VTK中具有距离测量功能的类有vtkLineWidget、vtkLineWidget2、vtkDistanceWidget,其中vtkDistanceWidget类是Kitware公司在5.4开发包里新添加的专门进行距离测量的工具,使用它可以快速完成对组织的测量工作。

3.1 二维切片的距离测量

通过多平面显示工具可以从三维CT图像数据场中获取二维的组织切片,使用vtkLineWidget对二维切片中的组织进行距离测量,该类本身不具备测量功能,但我们可以借助其内部工具来完成测量。

生 物 医 学 工 程 研 究 第29卷第1期 戴振晖,等:VTK -Widgets在医学图像交互测量中的研究 vtkLineWidget定义了一个交互放置在三维场景内的线段,当对二维切片进行距离测量时,把线段交互式的放置在需要测量的组织切片上,设线段的两个端点分别为p1和p2,p1的坐标为(x1,y1,z1)p2的坐标为(x2,y2,z2),利用两点间的距离公式计算p1和p2之间的距离。

通过vtkLineWidget得到两个端点坐标,利用距离公式求得距离值为length,最后通过vtkTextActor类将结果显示在屏幕上。如图2所示,使用此方法测量胸部切片内的气管直径为25.7152 mm。图2 气管直径测量结果

Fig 2 Measurement result of tracheal diameter

3.2 三维器官的距离测量

当用户在计算机屏幕上用鼠标点击后,系统根据屏幕坐标点拾取到用户所需要的三维物体上的点,将其转化为世界坐标系下的坐标值,拾取两个特征点后,通过计算输出用户所需要的测量数据。本文使用vtkDistanceWidget类对重建后的三维器官进行长度测量。

vtkDistanceWidget是vtkAbstractWidget的子类,用户可以独立的放置刻度尺的两个端点,当两个端点被释放时,有一个专门的PlacePointEvent被激活以便有专门的操作来重置点的位置,要使用这个类需要确定一个vtkDistanceWidget实例和一个Representation。它响应下列VTK事件:鼠标左键按下,鼠标拖动,鼠标左键释放,这些VTK事件通过vtkWidgetEventTrans

lator类转换成vtkDistanceWidget的widget事件:增加点,移动,结束选择[3]。

在VTK的三维场景中一般存在两种模型,一种是用于对三维物体操作的Widget 模型,另一种是在场景中显示的data模型。但本身处于三维场景中的widget 模型是无法自行触动消息响应函数对data 模型进行控制,要想达到此目的,需要在它和data 模型中间设置一个桥梁,该桥梁就是通过command模式实现的回调函数。同时在外部存在一个Observer 模块对data 模型进行观察,随时反映data 模型的状态[4]。

交互代码:

vtkDistanceRepresentation2D *Distance;

double pos1[3], pos2[3];

Distance->GetPoint1WorldPosition(pos1);

Distance->GetPoint2WorldPosition(pos2);

double dist=sqrt(vtkMath::Distance2BetweenPoin

ts(pos1,pos2));

通过vtkDistanceRepresentation2D获得刻度尺两个端点在世界坐标系内的坐标,使用距离计算函数: sqrt(Distance2BetweenPoints())得到被测物体的长度值dist,最后通过vtkDistanceRepresentation2D的SetTi

tle()函数将计算结果显示在屏幕上。如图3所示,使用传统的光线投射算法对头骨进行三维重建[5-6],测量的眼眶宽度为74.4 mm。

4 角度测量

4.1 二维切片的角度测量

通过多平面显示工具可以从三维CT图像数据场中获取二维的组织切片,使用vtkAngleWidget对二维切片中的组织进行角度测量。

vtkAngleWidget用来测量共端点的两条射线间的夹角,两条射线是由三个点(一个中心点,两个端点)确定的,三个点的位置可以独立的设置,当其被释放时,有一个专门的PlacePointEvent被激活以便有专门的操作来重置点的位置,要使用这个类需要确定一个vtkAngleWidget实例和一个Representation(vtk

AngleRepresentation的一个子类)。

交互代码:

vtkAngleRepresentation2D *Rep;

double point1[3], center[3],point2[3];

Rep->GetPoint1WorldPosition(point1);

Rep->GetCenterWorldPosition(center);

Rep->GetPoint2WorldPosition(point2);

通过vtkAngleRepresentation2D获得三个特征点在世界坐标系内的坐标并自动计算出两条射线的夹角。如图4所示,测量的椎骨切片的角度为88.3°。图4 椎骨角度测量结果

Fig 4 Measurement result of vertebrae’s angle

4.2 三维器官的角度测量

在制作三维模型时,经常需要测量某个部位的角度,使用vtkAngleWidget可以对立体模型的角度进行测量。

三维角度测量与二维角度测量的工作机制相同,唯一的不同在于:三维角度测量使用vtkAngleRe

presentation3D作为vtkAngleWidget的Representation。通过vtkAngleRepresentation3D获得三个特征点在世界坐标系内的坐标并计算出两条射线的夹角。如图5所示,测量牙齿模型中牙根的角度为42.2°。

图5 牙根角度测量结果

Fig5 Measurement result of fang’s angle

5 面积测量

肿瘤体积的测量是临床诊断和放射治疗的重要指标,为了更加准确地评估治疗效果,对包含肿瘤的切片进行处理,计算从断层切片中分割出的肿瘤区域的面积,用此面积乘以扫描的层距以代表每一层的体积,通过累加得到肿瘤的体积[7],所以,切片的面积测量对于体积的测量是有重要意义的。VTK并未提供专门测量面积的工具,我们可以用vtkContour

Widget分割出肿瘤区域,采用多边形近似法计算肿瘤切片的面积。

本研究以气管的轴位切片为例计算面积,即切片位于XOY平面上,见图6,求n边形面积,把n边形的每条边的两个端点分别与坐标原点O连接,构成n个以O为顶点的三角形[8]。设三维空间内一个三角形三个顶点的坐标分别为:A0(x0,y0,z0),Ai(xi,yi,z0),Ai+1(xi+1,yi+1,z0),z0表示三角形位于z=z0平面上,利用三角形面积公式求每个三角形的面积。三角形面积公式:

Si=(x0yi-x0yi+1-xiy0+xiyi+1+xi+1y0-xi+1yi)*0.5(1)

设多边形的顶点分别为A1,A2.....An那么多边形的面积为:

S=∑n-1i=1S(OAiAi+1)+S(OAnA1)(2)

S(OAiAi+1)表示以O为顶点的三角形面积,当三个顶点顺时针排列时面积值为负,逆时针排列时面积值为正,三角形面积值的正负分别表示此三角形使多边形面积增加还是减小。

因为每个三角形都有一个顶点为坐标原点O(0,0),那么三角形的面积为:

S(OAiAi+1)=0.5(xiyi+1-xi+1yi)(3)

多边形面积为:

图6 多边形划分为多个三角形的图解

Fig 6 Schema of polygon pided into several triangle

利用vtkContourWidget实现以上算法,vtkContour

Widget是vtkAbstractWidget的子类,用来选择一系列点,并在这些点之间画线。利用vtkContourWidget画轮廓线时,为了画出一个闭合的区域,取点原则是最后一个结点与第一个结点重合。 交互代码:

vtkOrientedGlyphContourRepresentation*ContourRep;

intn=

ContourRep1 -> GetNumberOfNodes();

double pos0[3];

double pos1[3];

double pos2[3];

ContourRep1->

GetNthNodeWorldPosition(0,pos0);

ContourRep1->

GetNthNodeWorldPosition (i,pos1);

n为轮廓线上结点的个数,由于第一个结点和最后一个结点重合,所以,形成的多边形有n-1个结点,可以划分成n-1个三角形。通过函数GetNthNodeWorldPosition(0,pos0)获得第一个结点的坐标pos0,pos1为第i+1个结点的坐标,如此可以获取多边形每一个顶点 的坐标。利用式(4)可以求得轮廓线内部区域的面积。如图7所示,测量的是气管的轴位切片的面积为:520.8603 mm2。

6 结论

所有测量功能均依靠鼠标在图像上点击和拖动完成,对于测量系统而言,精度是一个重要的参数,本文中的测量方法与两个因素密切相关,一是比例尺的确定,另一个就是测量步骤中标记线段的准确性。要提高整个系统的测量精度,可以通过提高图像的扫描分辨率,放大图像以及多次测量求平均值的方法来实现。

下载