基于VTK的医学图像三维可视化实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于VTK的医学图像三维可视化实现
郑小中;周振环;赵明
【摘要】3D visualization of medical image on the platform of visual studio 2008 is realized by using visualization toolkit, focusing on how to use Marching Cubes algorithm and ray-casting algorithm for 3D reconstruction with all kinds of slices, such as DICOM slices and so. Interactive surface developed by MFC and summary of data preprocessing and optimization during the reconstruction are also discussed.%利用VTK可视化工具包在Visual Studio2008平台上实现了医学序列图像三维的可视化.在对三维数据的预处理和优化基础上,在MFC实现的可交互界面上,用Marching Cubes(立方体移动)算法和Ray—casting(光线投射)算法对DICOM等格式的切片进行三维重建.
【期刊名称】《深圳职业技术学院学报》
【年(卷),期】2011(010)005
【总页数】9页(P17-25)
【关键词】VTK;MFC;DICOM;立方体移动;光线投射
【作者】郑小中;周振环;赵明
【作者单位】五邑大学,广东江门529020;深圳职业技术学院,广东深圳518055;深圳职业技术学院,广东深圳518055;深圳职业技术学院,广东深圳518055
【正文语种】中文
【中图分类】TP317.4
尽管计算机断层扫描(CT)及核磁共振(MR)已广泛应用于疾病诊断,但是这些医疗仪器只能提供人体内部的二维图像,医生只能凭经验由多幅二维图像对病灶的大小及形状进行估计,这给诊断带来了困难[1].此外,从宏观上来看,国内已经具
备了医疗设备的生产能力,但许多医疗软件仍需高额从国外进口,致使大多数的医疗单位难以承受,对进口软件的维护成本较高,也增加了患者的负担.从微观上来看,用于图像处理的软件占据统治地位的仍旧是OpenGL和DirectX,而这 2种
技术在使用上却存在着缺陷.例如OpenGL是开源的,但因其主要用于底层算法的实现,所以工作量及难度都比较大;而 DirectX又只限于Windows图像处理的开发,所以制约着图像处理开发的进步发展.
本文以VTK(Visualization Toolkit)为基础,在Windows平台上,以Visual Studio 2008为开发平台,结合MFC(Microsoft Foundation Classes),对多种格式的二维切片、Marching Cubes算法和Ray-casting算法在VTK中的实现
及优化进行研究,并实现了面绘制和体绘制.
1 可视化工具包VTK
1.1 VTK简介
VTK(Visualization ToolKit)是一套用于计算机图形可视化及图像处理的开源的、面向对象的工具包,1993年由美国 GE公司研发部的 Will Schroeder和Ken Martin作为开源软件首次发布,并支持多平台(如Windows、Unix和Linux)
的软件系统[2].VTK可以利用已成为工业标准的三维图形图像绘制库 OpenGL,使人们可以有效地利用各种支持OpenGL标准的显卡进行硬件加速处理,且实践证
明 VTK在三维化的效果更好、速度更好.此外,VTK利用面向对象的编程模式大大简化了用OpenGL开发的代码复杂性,使编程更加简洁易读,代码的开源性也在
不断地促使工具包的丰富和完善,用户可以根据自己的编程能力编写出适合自己的功能模块,其强大的功能已被医疗软件开发商和研究机构所认可.
1.2 VTK的程序框架结构
VTK主要由图形模型和可视化模型构成:
1)图形模型主要包括的类有:vtkRenderWindow(绘制窗口)、vtkRenderer (绘制器)、vtkLight(光源)、vtkCamera(照相机)、vtkActor(角色)、vtkProperty(特征)和Transform(变换).
2)可视化模型采用数据流(Dataflow)方法将各个对象连接成可视化网络结构,最终形成流水线管道(Pipeline),管道是贯穿于VTK的一个核心内容,其每个
对象将负责相应的数据处理或用户输入等操作.可视化模型的最高层次是数据源,
因为VTK并不善于绘制复杂的图形结构,所以其数据一般来自自带的简单数据集(Simple Source)或者外部的图像文件;将数据源传送给各种数据处理对象(如等值面的提取,表面法线的生成等滤波器或函数),对数据进行加工处理;最后以一个或多个映射器(Mapper)将数据集映射为图库中对应的图形几何,以此结束管道.映射器的输出主要用于可视化或写入等操作.数据流中各个对象的处理联系紧密,尤其是滤波器、读/写图像等操作,所以可以由该对象的 Update()方法实时触发执行,以便为下步操作提供准备.图1展示了VTK的框架结构及可视化流水线[3].
1.3 VTK的图像读取器
目前医学影像设备种类繁多,成像原理及图像格式不尽相同,给图像处理带来了困难.VTK不仅提供了DICOM图像文件读取的接口,还提供了其他类型图像的接口,并可以用vtkImageShiftScale将其他数据类型的图像转换为VTK可以识别的unsigned short类型或者unsigned char类型,极大地方便了图像显示和处理操作.
图2展示了VTK提供的5种图像读取器的类关系图及其主要成员函数,其中
vtkVolume16Reader读取的图像主要用于三维可视化操作,其他4种既可读取单个图像也可以读取多个切片图像.
·SetFilePrefix()和 SetFilePattern()共同设置读取文件的目录及文件名前缀格式,vtkDICOMImageReader的 SetDirectoryName()只需指定切片的读取目录即可(如果切片文件名没有特殊的扩张格式),如果每个切片有规范的文件名格式,需要采用SetFilePattern()予以说明[2].例如:读取文件夹 BMPFiles下切片格式为BN1.BMP BN2.BMP...BN256.BMP的 BMP文件时,除了SetFilePrefix()设置为“.../BMPFiles/BN”外,还需将SetFilePattern()设置为“%s%d.BMP”.
图1 VTK框架结构及可视化流程
图2 读取器类结构
·SetDataExtent()用于指定切片的大小(前4个参数)和读取切片的范围(后2个参数);
·SetDataSpacing()用于设置X,Y,Z轴方向上像素的间距. ·SetDataImageRange()主要用于设置读取的文件范围,常用于
vtkVolume16Reader.
·SetDataOrigin()设置数据集的中心坐标.
·SetFileNameSliceOffset()用于设置从某个切片开始读取,默认值为 1,即从第一切片读取切片序列.
·SetFileNameSliceSpa cing()用于设置读取有规律的切片,如将其设置为 2时,将读取切片filename.1,filename3,filename5....默认值为 1即连续读取切片序列.
·SetDataDimension()用于设置切片的尺寸.
2 VTK与MFC的接口
本文以 Visual Studio 2008为例,首先确保VTK同Visual Studio2008已正确配
置;其次将程序中用到的类库添加到“项目→属性→配置属性→链接器→输入→附加依赖项”中(注意每个类库需要附带扩展名.lib,且类库之间以空格隔开).此外,VTK与MFC的常见接口有两种:
第一种方式可以采用 vtkRenderWindow类中的 SetParentId()函数设置绘制窗口的父窗口句柄,一般为 MFC中某控件的句柄(如staticText、当前视图、对话框等),以此将VTK的绘制窗口定位并覆盖在MFC指定的控件上,如
renWin→SetParentId(hwnd).但由于该操作主要实现在控制台程序中,所以不仅无法实现MFC的鼠标响应和消息的传递等交换功能,而且还限制了后续代码的扩展,所以并不提倡该方法[3].
第二种方法采用MFC的数据处理(文档类实现)和显示(视图类实现)分离机制,充分利用面向对象的编程风格和MFC的消息机制及类库函数,可以实现友好的交互界面.该操作用到的头文件主要有 vtkWin32OpenGLRenderWindow.h,vtkWin32 RenderWindowInteractor.h,vtkMFCWindow.h,对应的类库为vtkMFC.lib.该功能的实现需要解决如下3个主要问题:
1)绘制窗口:通过vtkMFCWindow *m_vtkMFC=new vtkMFCWindow(this)
将VTK的绘制窗口指定到MFC的视图窗口(该操作在视类中进行设置,所以直
接用this即可,其他窗口对象也可以),并通过代码
m_vtkMFC→GetRenderWindow()→Add Renderer(m_Renderer)将绘制器添加到绘制窗口中现实对角色的绘制操作.
2)交互:利用代码m_vtkMFC→GetInteractor()→SetInteractorStyle(style)设
置利用鼠标交互的方式,可以实现放缩、移动、旋转等操作.
3)重绘:在视图类 OnDraw()函数中添加代码m_vtkMFC→DrawDC(pD C),当
对绘制窗口(视图窗口)进行交换时,实现对绘制窗口进行重绘操作[4].
本程序主要是基于MFC的FormView框架结构,首先在视类头文件中声明4个
函数,void readFile()、void initSlider()、void setSlider()、void Draw() 分别实现切片的读取、滑块的初始化、滑块值的设置、数据流的实现;然后在OnInitialUpdate()中对程序启动时进行初始化,即调用readFile()、initSlider()、Draw();最后在各个滑块的OnNMReleasedcapturesclar1op()消息中对Draw进行调用,实现交互绘制.参考代码如下:
3 三维可视化的实现
三维可视化主要包括面绘制与体绘制2种.
3.1 面绘制
面绘制是采用分割技术对一系列的二维图像进行轮廓识别、提取等操作的过程,最终还原出被检测物体的三维模型,并以表面的方式显示出来.图3展示了面绘制的数据流结构.
图3 面绘数据流
3.1.1 提取等值面(Marching Cubes)
对图像进行进行提取等值面操作(分割操作),不仅需要选用合适的分割算法,还需要了解被分割对象的组织结构,如:皮肤和骨骼的密度是不同的,并且头盖骨同其他部位的骨头密度也显然不同,根据不同组织具有不同的密度(或者灰度值)进行等值面提取操作.
经典的Marching Cubes算法的基本原理:首先,假定原始数据是离散的三维空间规则数据场,用于医学诊断的断层扫描仪(CT)及核磁共振仪(MRI)等产生的图像均属于这一类型;其次,为了在这一数据场中构造等值面,给出所求等值面的值;最后,找出等值面经过的体元位置,求出该体元内的等值面并计算出相关参数,以便由常用的图形软件包或图形硬件提供的面绘制功能绘制等值面.由于该方
法是逐个体元依次处理的,因此被称为移动立方体法(Marching Cubes).
用MC方法求等值面的步骤为:①将三维离散规则数据场分层读入内存;②扫描两层数据,逐个构造体元,每个体元中的8个角点取自相邻的两层;③将体元每个角点的函数值与给定的等值面做比较,根据比较结果,构造该体元的状态表;④根据状态表,得出将与等值面又交点的体元边界;⑤通过线性插值方法,计算出体元边界与等值面的交点;⑥利用中心差分方法,求出体元各角点处的法向,再通过线性插值方法,求出三角形各定点处的法向;⑦根据各三角面片个顶点的坐标值及法向量绘制等值面图像.
VTK主要提供了两种提取等值面的类vtkContourFilter滤波器和封装了 MC (Marching Cubes)算法类vtkMarchingCubes,最终通过设置SetValue (arg1,arg2)实现对某轮廓组织的提取,其中arg1是提取的标号一般从0开始,arg2是提取等值面的值,所以可以同时实现多个等值面的提取操作,但由于不同组织的等值信息难以分类,所以我们在这里采用滑块(Slider Control)进行调节.
3.1.2 数据处理
根据需要可以对读取的图像进行各种预处理或者优化操作,例如在 VTK 中通过vtkPolyDataNormals在等值面上产生法向量;用vtkStripper在等值面上产生纹理或三角面片等.最终实现图4等值面的绘制操作.程序的核心代码如下:
3.1.3 面绘制实验结果
实验数据来源于某骨质医院和 VTK数据包.图4采用读取器vtkVolume16Reader 读取93张64*64大小的头部CT数据,将vtkContourFilter设置为皮肤灰度值为500的绘制效果;图5用vtkDICOMImageReaderd读取34张胸腔DICOM图
像,图像大小为512*512,vtkMarchingCubes设置骨骼灰度值150的绘制效果;图6利用257张BMP格式的头颅图像,图像大小为256*256,用vtkBMPReader读取数据,vtkMarchingCubes设置等值为80的绘制效果;图7为利用1878张大小为 587*341的 JPG格式人体骨骼图像,用vtkJPEGReader
读取标号 1001到 2878的图像,vtkContourFilter设置等值为100的绘制效果. 3.2 体绘制
体绘制不同于面绘制,面绘制需要生成中间几何图元,而体绘制是直接绘制,所以内存的需求较面绘制小,但是由于每切换一个视角需要重新对所有的像素点进行颜色、透明度等计算,所以需要的时间又比面绘制的长.
本系统利用光线投射算法进行体绘制,光线投射算法的基本原理如图8所示.
图4 头部皮肤效果
图5 胸腔骨骼效果
图6 头骨效果
图7 人体骨骼效果
图8 光线投射算法基本原理流程图
1)数据预处理:常见有2种操作,一种是类型的转换,通过vtkImageShiftScale 将不同类型的数据集转换为 VTK可以处理的数据;另一种是剔除冗余数据,例如
通过vtkStripper防止无效的旧单元的存在,提高绘制速度.
2)数据分类:三维数据场中的数据是三维空间中多种不同物质的测量结果或计算机数值计算的结果.例如,在人体或动物的CT扫描图像中,对应用骨骼、肌肉和皮肤等不同密度的物质,就有不同的CT值,在CT图像中表现为具有不同的灰度值.为了在最终的可视化图像中以不同颜色正确地表示出共存的多种物质的分布,就需要对数据进行分类,找出数据与不同物质之间的对应关系;为了在最终图像中以不同颜色表示单一物质的不同属性,如温度、密度等,也需要进行分类.所以分类是
整个可视化算法非常重要的一步,但是分类又是非常困难的,又如,人的头部同一组织结构往往具有不同的灰度值,而同一灰度值的像素又有可能属于不同的组织结构.因此,尽管图像处理和模式识别技术对物质分类问题进行了多年研究,但仍然只能对简单的或特定的三维数据场进行自动分类.本范例,为了方便寻找坡度或不同组织,采用滑块Slider Control进行实现.
3)给数据点赋颜色值:将分类后的组织信息分别予以不同的颜色,便于图像分析是非常必要的,VTK 采用 vtkColorTransferFunction 类的AddRGBPoint()函数将不同组织信息转换为不同的颜色.
4)给数据点赋不透明度值:在体绘制中,需要显示三维数据场的内部结构,因而需要生成具有透明度的图像.因此对每个体元不仅要根据分类结果赋予不同的颜色值(R,G,B),而且还要赋予不透明度值α.α=1表示该体元完全不透明;α=0则表示完全透明.体元颜色值由实现, iP为第i种物质所占的百分比, ),,( iiiiii BaGaBaCi= 为第i中物质的颜色值.VTK采用分段函数vtkPiecewiseFunction类的AddPoint()函数实现不同组织透明度的设置.
5)光照效应计算:VTK中采用光线函数 vtk-VolumeRayCastCompositeFunction进行投射,最终用vtkVolumeRayCastMapper进行光效应等的计算.
6)图像合成:主要通过设置 vtkVolume的SetMapper()和 SetProperty()函数将上述类型进行合成.
VTK中对应上述的核心代码如下:
面绘制图像5和6,经滑块调节后体绘制效果见图9,10,得到较高的绘制效果. 图9 头部光线投射重建效果
图10 胸腔光线投射重建效果
参考文献:
[1] 齐敏,位军,陈世浩.M Lehmpfuhl.基于 VTK的医学三维可视化分析系统[J].计算机仿真,2008,25(3):242-245.
[2] 骆建珍,林财兴,孟令旗,等.DICOM医学图像三维可视化系统的研究[J].机电一体化,2007,13:45-48.
[3] 罗火灵,许永忠,陈世仲.基于VTK和MFC的医学图像三维重建研究和实现[J].生物工程学进展,2010,31(1):23-28.。