基于VTK的医学三维图像模型构建与切割
2010-07-07钟海波余伟巍
钟海波, 余伟巍, 席 平, 何 飞
(1. 北京航空航天大学机械工程及自动化学院,北京 100191;2. 昆明医学院第一附属医院骨科,云南 昆明 650032)
随着计算机技术和医学三维图像可视化技术的发展,计算机辅助虚拟外科手术在帮助医师制订周密的手术方案、术中导航及临床教学中均具有重要的指导意义[1]。而在基于医学图像数据(CT, MRI等)所重建的三维模型中进行虚拟切割是其中的重点及难点。
文中应用医学三维图像可视化技术,结合开发工具VTK和MFC,建立了基于骨组织的计算机辅助模拟手术系统平台,实现了基于常用绘制算法Marching Cube(移动立方体法)和Ray Casting(光线投射法)的三维图像模型重建。在此基础上,给出虚拟切割的交互操作技术以及基于面切割和体切割的三维骨组织模型的切割仿真。
1 VTK简介
VTK是William J Schroeder, Kenneth M Martin, Willliam E Lorensen三人于1993年在OpenGL 的基础上利用面向对象技术,设计和实现的可视化开发库,由美国Kitware公司负责维护。
主要功能是进行计算机图形、图像处理和科学计算可视化,尤其提供了强大的三维重建功能[2]。VTK的显著特点就是管道(Pipeline)化,即一个VTK程序实际上就是一个完整的渲染管道,其具体流程如图1所示。
图1 VTK流程图
2 切割交互
虚拟切割的交互操作是利用鼠标模拟手术刀,在三维重构模型上画出切割线,选定切割区域,剖切位于其中的实体。
(1)坐标系之间的转换
在计算机图形学里,通过二维图像来表现三维立体图形,如图2所示三维立体投影到屏幕上得到平面图像。VTK中提供了虚拟相机(位于视点),用作成像工具。
上述投影变换涉及到了多个坐标系,即世界坐标系,观察坐标系以及屏幕坐标系,分别对应于图2中坐标系OXYZ,O′X′Y′Z′,OeXeYeZe。
世界坐标系是用户所使用的基准,为右手系,同时也用以确定相机及光源的位置和方向。
观察坐标系是虚拟相机用以成像的坐标系,为左手系。坐标原点O′位于视点上,也即相机的位置,视线方向为Z′轴。相机的特性可表示为一个4×4的变换矩阵,用以将世界坐标转换为观察坐标。
屏幕坐标系是图像平面上真正的像素位置,也是左手系。坐标原点Oe位于视心(视线与屏幕画面的交点),也即相机的焦点,Ze轴与Z′轴重合。而窗口在屏幕上的大小等因素决定了观察坐标如何映射为像素位置。
图2 三维投影原理图
(2)交互实现
利用鼠标在屏幕上构建一个封闭多边形,并记录边界多边形顶点的坐标,由所获取的平面封闭多边形及视线方向OO′构成一个无限长柱体作为所定义的切割区域。为了方便交互操作,文中采用了橡皮筋画线的方式,即随着鼠标的移动,动态显示所画直线的临时图元。
MFC与VTK均有自己独立的显示窗口和消息响应机制,虽然在系统中已将MFC与VTK进行了深层次的集成,构建了统一界面和交互响应,但是两者的窗口坐标系并不统一,所以在利用MFC鼠标响应获取顶点坐标构建橡皮筋多边形的同时,需要利用VTK的鼠标响应获取多边形顶点坐标用于坐标转换。程序中关键函数代码如下:
void OnLButtonDown(UINT nFlags, CPoint point)
{ //MFC的左键响应函数,point为MFC窗口中屏幕坐标值
……………………………
iren->GetEventPosition(pick[0],pick[1])
//获取VTK中屏幕坐标值
picker->Pick((double)pick[0], (double)pick[1],0.0, ren);
//到世界坐标系的坐标变换
picker->GetPickPosition( pickPos )
//获取世界坐标系中坐标值
……………………………
}
3 VTK中模型切割实现
虚拟切割主要是模拟手术刀的效果或是剔除不感兴趣部分,操作大多是直接作用于模型数据,通过破坏数据的结构而达到切割效果。在VTK管道流各种数据结构形式中,文中用到了其中两种:
· Structured points(结构化点集),其数据的拓扑属性和几何属性都是规则的。医学图像中DICOM格式即是这一种,对应于VTK中类vtkImageData。
· Polygonal Data(多边形体数据),由简单的图形(三角形等)组成的复杂三维图形通常是用这种数据结构来表示,对应于VTK中类vtkPolyData。
医学图像三维模型分别基于面绘制和体绘制算法重建,文中针对上述不同模型采用了不同的切割实现。
3.1 基于Marching Cube模型面切割实现
Marching Cube算法的基本思想是逐个处理数据场中的立方体(体素),分类出与等值面相交的立方体,并插值计算等值面与立方体边的交点来构造中间几何图元(一般为三角面片)。在VTK管道流中处理的数据结构表示为多边形数据(PolyData)。
(1)面切割原理
由切割区域边界与构成三维模型的三角形面片进行求交运算[4]。通过判断三角面片顶点与切割区域边界之间的相对位置来检测三角面片与切割区域的关系,处在切割区域之内的三角面片被去除,处在切割区域之外的三角面片保留在模型中,相交的三角面片将进行切割运算,并在交界处生成新的三角面片,如图3所示。
结果改变了输入多边形数据的内部几何和拓扑结构,去除被切割的三角形单元,在交界处生成新的三角形单元,这样就构成了新的多边形数据,实现了面切割的功能。
图3 区域边界与三角面片位置关系
(2)面切割实现
在VTK中,提供了类vtkClipPolyData来裁剪多边形数据,用户可以构建该类对象并设置相关属性来实现对三维重建模型的任意面切割。另外,通过调用函数GenerateClippedOutputOn来获取并保存被切割部分的多边形数据,以此实现后续一系列交互功能。如图4所示为一面切割过程示意图。
图4 面切割过程图
3.2 基于RayCasting模型体切割实现
RayCasting算法的基本思想是对于图像平面上的每个像素向数据场投射光线,在光线上采样并沿线段积分计算光亮度和透明度,按采样顺序进行图像合成,得到结果图像。可以生成高质量的显示图像,由于体绘制计算数据量大,所以相比面绘制,速度较慢。在VTK管道流中处理的数据结构表示为结构化点集(Structured points)。
(1)体切割原理
体绘制模型的切割方法一般有两种:分别基于投射光线或三维体数据进行处理来达到切割效果。
· 基于投射光线的切割[5]通过投射光线与切割区域边界面的求交,确定新的光线采样区间,仅在区间上进行重采样计算并合成最终图像。这种方法的优点是保存了数据的完整性,并且由于减少了RayCasting算法采样点的计算,极大地提高了绘制速度。但是,这种方法不能对被切割掉的部分进行操作。
· 基于三维体数据的切割[6]通过直接对体数据进行操作,检测体素与切割区域的位置关系,将处于切割区域内的体素值置为所设定阈值,使体数据丢掉该部分灰度信息,从而使其在最终图像中不可见来达到切割效果。由于三维体数据量比较大,相比面切割,切割速度会比较慢。
由于在虚拟切割过程中,往往需要恢复已被前面切除的部分并进行重新定位切割,以及在切割完成之后,可能需要保留被切割部分并对之进行交互操作。所以文中采用第二种方法,可以直接对体数据进行操作来完成上述功能。
(2)体切割实现
由于VTK中体绘制管道流数据结构Structured points的特殊性,不能改变其数据的拓扑结构,并不能像多边形数据那样去除掉数据单元来实现切割,所以只能改变每个体素所包含的灰度值信息。
体数据量非常巨大,达到千万级(文中CT数据512×512×233),如果遍历体数据中的每个体素并进行位置关系判断,计算量将非常大,可以在预处理阶段通过设定阈值threshold构建一vtkIdList链表,来记录有效数据点的Id,这样极大地减少了所需处理的体素数,提高了切割速度。
空间点与切割区域之间的位置关系,一般可以通过点与切割区域边界(多边形柱体)之间的距离dis来判断。若dis<0,则处于切割区域内,将会被“切割”。但是,空间点与面之间三维距离的计算包含大量的乘除法运算,将会影响计算速度。文中通过投影将三维距离计算转为点与直线二维距离的计算,并在判断过程中加入了包围盒的检测,大大优化了计算速度。
另外,在体切割过程中需要保存被切割的体数据,可以通过构造一与初始数据具有相同拓扑结构的空vtkImageData数据ImageData_T,来临时储存体数据,并在切割完成后,获取被切割体数据的最小包围盒来优化ImageData_T。
综上所述,通过遍历vtkIdList中体素,体绘制切割算法的具体描述如下:
1)获取当前体素的空间坐标CurrentPoint;
2)将CurrentPoint按视线方向投影到观察坐标平面,获取投影坐标ProjectPoint;
3)将ProjectPoint与切割多边形包围盒Bounds进行位置关系的初步判断。若在区域内,则转至 4),否则转至 1);
4)将ProjectPoint与切割多边形继续进行位置关系判断,若在区域内,则转至 5),否则转至1);
5)将当前体素灰度值按对应位置存入ImageData_T中,并修改当前体素灰度值为所设定阈值。然后转至 1);
6)获取被切割体数据最小包围盒,优化ImageData_T。
图5为一体切割过程示意图。
图5 体切割过程图
4 讨 论
本文利用两种三维重建方法构建了基于医学CT数据的三维骨组织可视化模型,并分别成功地在三维重建模型完成了虚拟切骨。对于所述两种切割方法各有优缺点,由于可视化算法和处理数据的不同,面切割的速度要明显优于体切割,两者的切割速度还受切割区域大小的影响;但面切割是对骨面的切割,切割后只是空洞的面,而体切割后能看到骨组织的内部结构。另外,在利用上述方法进行切割过程中,可以把切割后和被切割的数据分别保存,这样就可以实现重复切割,撤销切割以及显示和操作被切割的数据等功能。上述方法均已在辅助模拟手术系统中实现。
结合MFC和VTK实现了虚拟任意切割功能。采用源代码公开的VTK类库作为开发医学系统的基础,避免了过多介入计算机图形图像学底层的算法,也可以根据自己的需要,改进和增加医学图像处理所需要的特殊算法,因而可以把更多时间和精力用于模拟手术系统功能的开发,可大大降低开发系统的难度,减少开发时间。
[1]Rhodes Michael L, Roberstson Douglas D. Applications in surgery and therapy [J]. Computer Graphics and Applications, 1996, 16(1): 28-29.
[2]Kitware, Inc. The VTK user’s guide [EB/OL]. USA,http://www.vtk.org.com.
[3]祁俐娜, 罗述谦. 基于VTK的医学图像三维重建[J].北京生物医学工程, 2006, 25(1): 1-5.
[4]秦绪佳, 欧宗瑛, 侯建华. 医学图像三维重建模型的剖切与立体视窗剪裁[J]. 计算机辅助设计与图形学学报, 2002, 14(3): 275-279.
[5]位 军, 齐 华, 王 毅, 等. 一种实时体切割绘制的光线分段预处理方法[J]. 计算机工程与应用,2006, (34): 225-227.
[6]王满宁, 韩正之, 宋志坚. 三维医学图像的快速重建与任意切割[J]. 复旦学报(医学版), 2002, 29(2):142-144.