医学图像三维重建技术的研究_第1页
医学图像三维重建技术的研究_第2页
医学图像三维重建技术的研究_第3页
医学图像三维重建技术的研究_第4页
医学图像三维重建技术的研究_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

医学图像三维重建技术的研究

0医学图像可视化科学可视化(vics)是计算机图形和数据处理技术的一个重要研究方向。事实上,将任何抽象的事物、过程用图形图像表示出来都可以称为可视化。作为科学术语,“可视化”一词正式出现于1987年2月美国国家基金会(NationalScienceFoundation,NSF)召开的一个专题研讨会上。医学图像可视化是科学计算可视化中的一个重要领域。在医学领域中,CT和MRI产生出大量的二维图像数据。所谓医学图像可视化,就是把由CT、MRI等数字图像成像技术所获得的人体信息在计算机上直观地表现为三维效果,从而提供传统手段无法获得的结构信息,有很高的临床价值。因此,由二维断层图像重建三维医学图像,构建医学可视化系统在医学可视化领域中具有重大的意义及应用价值。可视化工具包(VisualizationToolKit,VTK)是目前医学可视化领域中使用最广泛的可视化开发工具。VTK是在三维函数库OpenGL的基础上利用面向对象技术,设计和实现的可视化开发库。它把可视化开发过程中经常遇到的细节屏蔽起来,并将一些常用的算法封装成类的形式供开发者使用(如本文将提到的MarchingCube算法,封装成vtkMarchingCubes类)。VTK是一个开源、自由获取的、支持多平台的软件系统,由美国的Kitware公司负责维护。目前最新的版本是VTK5.4.2。由于VTK是开放式的免费软件,而且具有强大的三维图形图像处理功能,良好的体系结构和高度的灵活性、可移植性,目前在美国、西欧等各个高校、研究所已经得到广泛的应用。在美国的某些大学里就有专门的教材用于高校教学。虽然VTK在欧美已经十分流行,但其在国内的发展却不容乐观,这些都应该引起有关部门和高校的重视。国内的浙江大学、清华大学、东南大学、中科院自动化所等在医学图像三维重建及可视化研究方面均做出了大量研究,开发了一些实验系统。但目前国内尚无成熟的商用系统。因此,开展这方面的研究,具有重要理论意义和广阔的应用前景。MFC是Windows下一套完整的C++ApplicationFrameworks[9,P246],与Windows系统的结合最为紧密且使用广泛,另外它更有强大的UI开发能力,可利用它开发出专业级的软件。VTK和MFC结合编程实现医学图像的可视化,能发挥各自的优势与性能,容易开发出功能完善、性能极佳的医学可视化软件。本文将实现VTK和MFC两者的混合编程,实现面绘制技术中的MC算法以及体绘制中的光线投射法(RayCasting)。1可视化网络的建立构成VTK的两个对象模型分别是图形模型和可视化模型。其中图形模型主要的类有以下7个:vtkRenderWindow渲染窗口、vtkRenderer渲染器、vtkLight灯光、vtkCamera照相机、vtkActor演员、vtkProperty属性和vtkMapper映射器。可视化模型利用了数据流(Data-flow)方法,将各个模块连接成一个流动的可视化网络(Visualizationnetwork),形成流水线管道(Pipeline),管道是贯穿VTK的一个核心内容,任何一个VTK程序都至少有一条Pipeline。各个模块对网络中流动的数据执行相应数据的处理以及响应用户输入。可视化网络的最高层是输入模块,用于读取数据或生成数据;接下来就是一系列的处理模块用于处理数据(如提取等值面,计算表面法线等);最后以一个或多个映射器(Mapper)结束管道,映射器的作用是把数据转化成图形或写入文件或流(Stream)中。可视化模型由两类对象组成(如图1所示),分别是处理对象(ProcessObject)和数据对象(DataObject)。处理对象又包括源(Source),过滤器(Filter)和映射器(Mapper)。源位于管道的开始,用于读入或生成数据;源的输出连接过滤器,在VC里可用语句:myFilter->SetInput(mySource->GetOutput())实现两者的相连;过滤器的输出通过类似的语句与映射器相连,从而终止管道。每个处理对象可以有零个,一个或多个输出,并且输出的数据类型是固定的,可通过有关的类进行变换,在实现处理对象之间的相连时要注意数据类型的匹配,这也是VTK选用C++语言书写的其中一个原因,因为C++是一种强类型语言。VTK管道的执行采用了一种基于每个对象内部修改时间的惰性赋值(Lazyevaluation)机制,亦即只有数据要求更新时才被执行,这涉及两个重要的方法:Update()和Execute()方法。每个处理对象都会跟踪它的最新修改时间(Lastmodificationtime),如果来自某个对象的输出请求更新,或者该对象(或其输入)被修改过,那么这个处理对象才会重新执行。管道的执行通过调用Update()方法,但通常我们都不用手动去调用这个方法,当Actor接收到渲染(Render)的命令时,Update()方法会送到它的映射器,然后自动地送往管道。Update()方法执行的方向与图1所示箭头方向相反。Update()会一直被送到源对象(SourceObject),源对象会比较它的修改时间和最近一次执行的时间,如果被修改过,那么它就会调用方法Execute()重新执行,Execute()方法的执行过程与图1箭头方向一致。2vtk和mbc的合并本文以VisualC++6.0为例。2.1vtkmfc.lib等函数库文件的设置建立新的VTK项目时,必须配置一些相关参数及环境变量,而且每建一个VTK的项目都必须进行这些设置。因为这些设置都是【Project/setting】里的,新项目没有默认这些设置。具体需要设置的参数如下:(2)修改【Project/setting】->Link->Input->Object/librarymodules值为:vtkMFC.libvtkDICOMParser.lib等。这些设置是告诉编译器新建项目要用到VTK里的哪些函数库,在项目链接时可能会用到这其中的某些库文件,如果在编程过程中提示还缺什么库文件的话再临时加进去。有一点需要特别指出的是vtkMFC.lib这个库文件,它是实现VTK和MFC混合编程的关键函数库。通过以上三个步骤的设置,就可以实现VTK和集成开发环境的集成。2.2vtkmfcwit-ls-pb文献里提出了实现VTK与MFC集成两种方法,其中第一种方法是通过设置vtkRenderWindow类中的SetParentId函数为当前视图或对话框句柄,通过如下语句实现:vtkRenderWindow*renWin=vtkRenderWindow::New();renWin->SetParentId(this->m_hWnd);这种方法只是简单地把VTK自带的渲染窗口覆盖在对话框或视图当中,屏蔽了MFC的鼠标响应和消息传递,不便于后续编程实现更复杂的功能。文献提到的第二种方法是VTK和MFC的深层集成,即通过改写视图类的相关函数从而达到集成的目的。笔者在这里尝试实现VTK与MFC集成的另一种方法,沿用MFC的设计机制,把数据处理(由文档类负责)和数据显示(由视图类负责)分开,使用VTK自带的类;vtkMFCWindow。具体步骤如下:(1)在视图类里加入两个私有成员变量,vtkRenderer*m_pvtkRenderer和vtkMFCWindow*m_pvtkMFCWindow,分别表示渲染器与渲染窗口,并定义函数用于获取这两个指针,因为在文档类里要用到这两个指针,而私有成员在类外禁止访问。(2)改写视图类的虚函数OnInitialUpdate(),在该函数里用New()方法实例化vtkMFCWindow对象,并关联绘制器,此为关键代码。即:this->m_pvtkMFCWindow=newvtkMFCWindow(this);this->m_pvtkMFCWindow->GetRenderWindow()->AddRenderer(this->m_pvtkRenderer);(3)在视图类的OnDraw()函数里调用vtkMFCWindow里的成员函数:DrawDC()。即:this->m_pvtkMFCWindow->DrawDC(pDC)。当然还要做一些有关m_pvtkRenderer和m_pvtkMFCWindow的初始化及“善后”工作。这里就不一一讲述。(4)在文档类里增加可视化管道中会用到的类,用这些类实例化对象,让这些对象作为文档类的数据成员,管道的执行过程可用成员函数的形式来实现。用VTK里的类vtkMFCWindow与MFC集成,可以很方便地利用VTK里设置的一些默认交互方法,如按下按键“P”用于拾取,按键“T”和按键“J”用于改变交互方式等。类vtkMFCWindow派生自MFC的类CWnd,vtkMFCWindow里定义了公共成员函数:GetRenderWindow()和GetInteractor(),分别返回指向vtkWin32OpenGLRenderWindow和vtkRenderWindowInteractor对象的指针,利用这两个方法就可以改变绘制窗口和交互方法的一些属性,而且还可以重写这个类的很多用于交互的虚函数,如OnLButtonDblClk,OnLButtonDown,OnKeyUp等。3tk里的tkmarchingcxys医学图像三维重建目前用到的方法主要是面绘制和体绘制,其中面绘制主要的算法有:Cuberille算法、MarchingCubes算法和DividingCubes算法,最常用的是MarchingCubes(移动立方体法),在VTK里把这个方法封装成类vtkMarchingCubes的形式供用户使用。体绘制用到的算法主要有:光线投射法(RayCasting),抛雪球法(Splatting,orFootPrint),错切-变形法(Shear-Warp),最大强度投影法(MaximumIntensityProjection,MIP)[3,P210]以及三维纹理映射(3DTextureMapping)[3,P218](基于硬件),另外还有基于硬件的VolumePro绘制[2,P157]。VTK目前支持三种体绘制技术:光线投射法、纹理映射和基于硬件的VolumePro[2,P137]。本文将编程实现面绘制中的MC算法,以及体绘制中的光线投射法,其中光线投射法又涉及到几个复合函数,都将一一进行比较。3.1投影合成法测试数据的完整性MC算法是三维规则数据场等值面生成的经典算法,为了在这一数据场中构造等值面,应先给出所求等值面的值,即所谓的“阈值”,MC算法首先找出该等值面经过的体元位置,每个体元有八个数据点(如图(2)所示),分别位于该体元的八个角点上。如果某体元一个角点的值大于(或等于)阈值,则该角点位于等值面之内(或之上)。如果该角点的值小于阈值,则该角点位于等值面之外。由于这一方法是逐个体元依次处理的,因此被称为移动立方体法(MarchingCubes)。利用该算法可以快速显示人体组织和器官的轮廓,占用计算机系统资源相对较少,交互速度也相对较快。但它不能保留体数据的完整性,只是显示体数据的一个面或只是一个空壳,如图(6)-(c)所示。光线投射法(RayCasting)是以图像空间为序的直接体绘制算法,它的基本原理(如图3所示)。从屏幕上的每个像素点出发,沿设定的视点方向,发出一条射线,这条射线穿过三维数据场,沿这条射线选择若干个等距的采样点,由距离某一采样点最近的八个体素的颜色值及不透明度值做插值,求出该采样点的颜色值和不透明度值。在求出该条射线上所有采样点的颜色值和不透明度值后,可以采用由前到后或由后到前的两种不同的方法将每一采样点的颜色及不透明度值进行合成,从而计算出屏幕上该像素点处的颜色值,生成最终图像。由后向前的图像合成方法:设第i个体素的颜色值为Cnow,不透明度值为αnow,进入第1个体素的颜色值为Cin,不透明度值为αin,经过第1个体素后的颜色值为Cout,不透明度值为αout,对于由后向前的图像合成方法有:Cout=Cin(1-αnow)+Cnowαnow由前向后的图像合成方法,有:Coutαout=Cinαin+Cnowαnow(1-αin);αout=αin+αnow(1-αin)在由前向后进行图像合成的过程中,不透明度值α必然逐步增大。当α值趋近于1时,说明该像素点的图像已接近于完全不透明,后面的体元不会再对该像素点的图像有所贡献,因而可以不再计算了。由于由前向后的图像合成方法可以省去无效的计算,速度较快,因而得到更为广泛的应用。在将采样点进行合成时,VTK提供了三种方法,如图所示(8)-(a)(b)(c)所示,光线投射法可以完整地保留体数据,包括数据体的表面和内部,这对于医学临床应用具有重要的价值。但这种算法需要遍历每个体素,而且当观察方向发生变化时,数据场中的采样点之前的前后关系也必然发生变化,这就需要进行重新采样,所以计算量极为庞大,针对该算法存在的问题,人们也提出了不少优化方法。3.2图像数据的提取管道是VTK程序里的核心,每一个VTK程序都至少有一条管道。所以在实现MC算法和光线投射法时,首先必须“搭建”管道,如图4所示,是每个VTK程序都应该有的一条管道的基本形式。利用MC算法实现医学图像三维重建的基本流程如图5所示,与图4的流程基本上一样。但如果按该流程编程的话,提取等值面所用的时间将会相当长,在LenovoY430,CPU-T4200,RAM-1,集显上测试,最长的时间能达五六分钟才能显示一幅图像,显然这样的处理速度是不利于交互的。所以应该对读入的数据进行处理,然后再进行等值面提取操作。文献中提到了一种减少数据量的方法:对读入的原始DICOM格式的数据转换为BMP格式的,再将所有的数据写到一个扩展名为“raw”的文件中,从而达到减少数据量的目的。这样确实能够达到减少数据量的目的,但同时也会造成原始数据的破坏,因为DICOM格式的图像,存储的灰度级能达4096级之多,而BMP存储的图像,其灰度级远远达不到4096,这样会造成图像的很多细节的丢失。笔者的方法是:用vtkDICOMImageReader批量读入DICOM格式的图像后,对其进行重采样(类vtkImageShrink3D),即图5“1”处(如图6(a)、(b))。然后再进行等值面的提取(类vtkMarchingCubes或类vtkContourFilter),设置阈值提取等值面。然后再对提取后的数据进行削减、平滑等操作,即图5“2”处,最后再通过Mapper传送到图形硬件,从而实现对二维医学图像等值面提取生成三维的图像,如图6所示。用VTK进行体绘制的基本流程如图7所示。要注意对读入的数据一定要对它的数据类型进行转换(图(7)“1”处所示),因为有些VolumeMapper只接受unsignedchar和unsignedshort等类型的数据,连接流水线管道时一定要注意数据类型的匹配。图7“2”处,可以设置不同的采样点合成函数,它的作用是对光线投射法中的每一条射线上等距采样点的合成,以生成该射线位置上的像素值,VTK提供三种合成函数,分别是:vtkVolumeRayCastCompositeFunction,vtkVolumeRayCastMIPFunction和vtkVolumeRayCastIsosurfaceFunction,如图8(a)、(b)、(c)所示。其中图8(b)是取阈值为1150进行绘制的,比较这三个图像可知,用vtkVolumeRayCastCompositeFunction合成函数的效果是最好的,其参数设置也较易,所以该函数也是最常用的。图7“3”处,可以设置不同的颜色值和不透明度值,用于观察不同的人体组织,通常这也是体数据可视化中最难的一部分,因为你必须了解底层数据的具体意义,以CT图像为例,空气与皮肤的分界值大概为500,而软组织与骨骼的分界值大概为1150。图8(d)是将皮肤设为半透明的效果。图7“4”处,可以加入功能强大的Widget组件,用于对任意平面的切割,以观察人体内部的信息,这一点对于医学临床应用具有相当重要的意义,其效果如图8(d)、(e)所示。图7“5”处,不能用类vtkVolumeMapper直接实例化对象,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论