KJ1185基于VTK医学图像三维可视化实现x1.docx
- 文档编号:24109145
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:15
- 大小:486.73KB
KJ1185基于VTK医学图像三维可视化实现x1.docx
《KJ1185基于VTK医学图像三维可视化实现x1.docx》由会员分享,可在线阅读,更多相关《KJ1185基于VTK医学图像三维可视化实现x1.docx(15页珍藏版)》请在冰豆网上搜索。
KJ1185基于VTK医学图像三维可视化实现x1
修改意见:
1)第一部分“可视化工具包VTK”的介绍略显繁琐,不够精炼;第二部分“VTK与MFC的接口”部分,内容不够充分,信息量不充足,编号中只有“2.1”不恰当;第三部分“三维可视化的实现”部分为本文重点,应结合3.1、3.3的框图进行较为详细的介绍;“结束语”部分过于简单,应增加应用领域、发展前景等内容。
2)在文字表达上还需润色,力求通顺、简单明了,杜绝错字漏字。
图表号码有误,全文有两个图2,请纠正。
文章在第一次出现英文缩略语时应首先以全称备注,图1、图2应有适当的中文说明。
3)补项目来源及作者简介:
按学报规范
4)以下是检索的结果,红字是对已有文献的重复,在文章中又没有标注,请修改:
三维地震数据场可视化足迹法研究。
南京理工大学硕士论文李志永
5%2008-06-01
三维超声实时可视化及GPU技术的应用上海交通大学硕士论文王磊
5%2008-01-01
重复的部分:
引言尽管计算机断层扫描(CT)及核磁共振(MR)已广泛应用于疾病诊断,但是这些医疗仪器只能提供人体内部的二维图像,医生只能凭经验有多幅二维图像对病灶的大小及形状进行估计,这给诊断带来了困难[1]。
此外,从宏观上来看,常见有两种操作,一种是类型的转换,通过vtkImageShiftScale将不同类型的数据集转换为VTK可以处理的数据;另一种是剔除冗余数据,例如通过vtkStripper防止无效的旧单元的存在,提高绘制速度。
(2)数据分类:
三维数据场中的数据是三维空间中多种不同物质的测量结果或计算机数值计算的结果。
例如,在人体或动物的CT扫描图像中,对应用骨骼、肌肉和皮肤等不同密度的物质,就有不同的CT值,在CT图像中表现为具有不同的灰度值。
为了在最终的可视化图像中以不同颜色正确地表示出共存的多种物质的分布,就需要对数据进行分类,找出数据与不同物质之间的对应关系;为了在最终图像中以不同颜色表示单一物质的不同属性,如温度、密度等,也需要进行分类。
所以分类是整个可视化算法非常重要的一步,但是分类又是非常困难的,又如,人的头部同一组织结构往往具有不同的灰度值,而同一灰度值的像素又有可能属于不同的组织结构。
因此,尽管图像处理和模式识别技术对物质分类问题进行了多年研究,但仍然只能对简单的或特定的三维数据场进行自动分类。
本范例,为了方便寻找坡度或不同组织,采用滑块SliderControl进行实现,如图9所示。
图9体绘制的操作界面(3)给数据点赋颜色值:
将分类后的组织信息分别予以不同的颜色,便于图像分析是非常必要的,VTK采用vtkColorTransferFunction类的AddRGBPoint()函数将不同组织信息转换为不同的颜色。
(4)给数据点赋不透明度值:
在体绘制中,需要显示三维数据场的内部结构,因而需要生成具有透明度的图像。
因此对每个体元不仅要根据分类结果赋予不同的颜色值(R,G,B),而且还要赋予不透明度值α。
α=1表示该体元完全不透明;α=0则表示完全透明。
体元颜色值由实现,
基于VTK的医学图像三维可视化实现
郑小中[1,2],周振环[2],赵明[2]
(1.五邑大学,广东江门,529020;2.深圳职业技术学院,广东深圳,518055)
摘要:
利用VTK可视化工具包在VisualStudio2008平台上实现了医学序列图像三维的可视化。
在对三维数据的预处理和优化基础上,在MFC实现的可交互界面上,用MarchingCubes(立方体移动)算法和Ray-casting(光线投射)算法对DICOM等格式的切片进行三维重建,(要有具体的结果)重建效果良好。
关键词:
VTK;MFC;DICOM;MarchingCubes;Ray-Casting
TheRealizationFor3DVisualizationofMedicalImageBasedOnVTK
ZHENGXiaozhong1,2,ZHOUZhenhuan2,ZHAOMing2
(1.WUYIUNIVERSITY,GuangdongJiangMen,529020;2.SHENZHENPOLYTECHNIC,GuangdongShenzhen,518055)
【Abstract】thepaperadoptsthevisualizationtoolkitrealizing3Dvisualizationofmedicalimageontheflatformofvisualstudio2008,whichplacestheemphasesonhowtousetheMarchingCubesalgorithmandtheray-castingalgorithmfor3Dreconstructionwithallkindsofslices,suchasDICOMslicesandso,ontheinteractivesurfacebuildbyMFC,andsummarythedatapreprocessingandoptimizationduringthereconstruction.
Keywords:
VTK;MFC;DICOM;MarchingCubes;Ray-casting
尽管计算机断层扫描(CT)及核磁共振(MR)已广泛应用于疾病诊断,但是这些医疗仪器只能提供人体内部的二维图像,医生只能凭经验有多幅二维图像对病灶的大小及形状进行估计,这给诊断带来了困难[1]。
此外,从宏观上来看,国内已经具备了医疗设备的生产能力,但许多医疗软件仍需高额从国外进口,致使大多数的医疗单位难以承受,对进口软件的维护成本较高,也增加了患者的负担;从微观上来看,用于图像处理的软件占据统治地位的仍旧是OpenGL和DirectX,而这两种技术在使用上却存在着缺陷。
例如OpenGL是开源的,但因其主要用于底层算法的实现,所以工作量及难度都比较大;而DirectX又只限于Windows图像处理的开发,所以制约着图像处理开发的进步发展。
本文以VTK(VisualizationToolkit)为基础,在Windows平台上,以VisualStudio2008为开发平台,结合MFC,对多种格式的二维切片、MarchingCubes算法和ray-casting算法在VTK中的实现及优化做了研究,并实现了面绘制和体绘制。
为VTK就各类图像进行医学三维可视化软件的开发提供了参考。
1.可视化工具包VTK
1.1VTK简介
VTK(VisualizationToolKit)是一套用于数据可视化的工具包,于1993年由美国GE公司研发部的WillSchroeder和KenMartin作为开源软件首次发布,并支持多平台(如Windows、Unix和Linux)的软件系统[2]。
VTK可以利用已成为工业标准的三维图形图像绘制库OpenGL,使人们可以有效地利用各种支持OpenGL标准的显卡进行硬件加速处理,且实践证明VTK在三维化的效果更好、速度更好。
此外,VTK利用面向对象的编程模式大大简化了用OpenGL开发的代码复杂性,使编程更加简洁易读,代码的开源性也在不断地促使工具包的丰富和完善,用户可以根据自己的编程能力编写出适合自己的功能模块,VTK强大的功能已被医疗软件开发商和研究机构所认可。
1.2VTK的程序框架结构
VTK主要由图形模型和可视化模型构成[2,3]:
(1)图形模型主要包括的类有:
·vtkRenderWindow(绘制窗口)和vtkRenderer(绘制器),他们共同实现图形和窗口之间的接口,将一个或多个角色通过绘制器绘制后在绘制窗口中进行显示,为用户提供交互界面。
·vtkLight(光源),通过设置光源的位置、亮度、颜色、照射角度、衰减程度等参数实现角色的不同显示效果。
·vtkCamera照相机,其主要定义了观察者的观察角度、聚焦点等属性,便于用户从不同角度进行观察。
·vtkActor(角色),角色代表绘制场景中的一个实体,它通过一个4*4的变换矩阵对角色所在绘制窗口中的位置、方向以及大小进行设置。
此外,还可以设置角色的绘制特性、引用、纹理映射等属性。
·vtkProperty(特征),指定了几何物体的光照及其它特征,最终传个角色。
·Transform(变换),Transform是一个4*4变换矩阵的堆栈,可以实现角色的平移、缩放、旋转等操作。
(2)可视化模型采用数据流(Dataflow)方法将各个对象连接成可视化网络结构,最终形成流水线管道(Pipeline),管道是贯穿于VTK的一个核心内容,其每个对象将负责相应的数据处理或用户输入等操作。
可视化模型的最高层次是数据源,因为VTK并不善于绘制复杂的图形结构,所以其数据来源一般来自自带的简单数据集(SimpleSource)或者外部的图像文件;将数据源传送给各种数据处理对象(如等值面的提取,表面法线的生成等滤波器或函数),对数据进行加工处理;最后以一个或多个映射器(Mapper)将数据集映射为图库中对应的图形几何,以此结束管道。
映射器的输出主要用于可视化或写入等操作。
数据流中各个对象的处理联系紧密,尤其是滤波器、读/写图像等操作,所以可以由该对象的Update()方法实时触发执行,以便为下步操作提供准备。
图1展示了VTK的框架结构及可视化流水线[4]。
图1VTK框架结构及可视化流程(英文该中文)
1.3VTK的图像读取器
目前医学影像设备种类繁多,成像原理及图像格式不尽相同,给图像处理带来了困难。
VTK不仅提供了DICOM图像文件读取的接口,还提供了其它类型图像的接口,并可以用vtkImageShiftScale将其它数据类型的图像转换为VTK可以识别的unsignedshort类型或者unsignedchar类型,极大地方便了图像显示和处理操作。
图2展示了VTK提供的五种图像读取器的类关系图及其主要成员函数,其中vtkVolume16Reader读取的图像主要用于三维可视化操作,其它四种既可读取单个图像也可以读取多个切片图像。
图2读取器类结构
·SetFilePrefix()和SetFilePattern()共同设置读取文件的目录及文件名前缀格式,vtkDICOMImageReader的SetDirectoryName()只需指定切片的读取目录即可(如果切片文件名没有特殊的扩张格式)[5],如果每个切片有规范的文件名格式,需要采用SetFilePattern()予以说明。
例如:
读取文件夹BMPFiles下切片格式为BN1.BMPBN2.BMP...BN256.BMP的BMP文件时,除了SetFilePrefix()设置为“.../BMPFiles/BN”外,还需将SetFilePattern()设置为“%s%d.BMP”。
·SetDataExtent()用于指定切片的大小(前4个参数)和读取切片的范围(后2个参数);
·SetDataSpacing()用于设置X、Y、Z轴方向上像素的间距。
·SetDataImageRange()主要用于设置读取的文件范围,常用于vtkVolume16Reader。
·SetDataOrigin()设置数据集的中心坐标。
·SetFileNameSliceOffset()用于设置从某个切片开始读取,默认值为1,即从第一切片读取切片序列。
·SetFileNameSliceSpacing()用于设置读取有规律的切片,如将其设置为2时,将读取切片filename.1,filename3,filename5...。
默认值为1即连续读取切片序列。
·SetDataDimension()用于设置切片的尺寸大小。
2.VTK与MFC的接口
本文以VisualStudio2008为例,首先确保VTK同VisualStudio2008已正确配置;其次将程序中用到的类库添加到“项目->属性->配置属性->链接器->输入->附加依赖项”中(注意每个类库需要附带扩展名.lib,且类库之间以空格隔开)。
2.1VTK与MFC混合编程的两种方式2.2?
第一种方式可以采用vtkRenderWindow类中的SetParentId()函数设置绘制窗口的父窗口句柄,一般为MFC中某控件的句柄(如staticText、当前视图、对话框等),以此将VTK的绘制窗口定位并覆盖在MFC指定的控件上。
但由于该操作不仅无法实现MFC的鼠标响应和消息的传递等交换功能,而且还限制了后续代码的扩展,所以并不提倡该方法。
第二种方法采用MFC的数据处理(文档类实现)和显示(视图类实现)分离机制,充分利用面向对象的编程风格和MFC的消息机制及类库函数,可以实现友好的交互界面。
该操作用到的头文件主要有vtkWin32OpenGLRenderWindow.h、vtkWin32RenderWindowInterac
tor.h、vtkMFCWindow.h,对应的类库为vtkMFC.lib。
该功能的实现需要解决三个主要问题:
(1)绘制窗口:
通过vtkMFCWindow*m_vtkMFC=newvtkMFCWindow(this)将VTK的绘制窗口指定到MFC的视图窗口(该操作在视类中进行设置,所以直接用this即可,其他窗口对象也可以),并通过代码m_vtkMFC->GetRenderWindow()->AddRenderer(m_Renderer)将绘制器添加到绘制窗口中现实对角色的绘制操作,
(2)交互:
利用代码m_vtkMFC->GetInteractor()->SetInteractorStyle(style)设置利用鼠标交互的方式,可以实现放缩、移动、旋转等操作。
(3)重绘:
在视图类OnDraw()函数中添加代码m_vtkMFC->DrawDC(pDC),当对绘制窗口(视图窗口)进行交换时,实现对绘制窗口进行重绘操作[6,7]。
3.三维可视化的实现
三维可视化主要包括了面绘制与体绘制两种。
3.1面绘制
面绘制是采用分割技术对一系列的二维图像进行轮廓识别、提取等操作的过程,最终还原出被检测物体的三维模型,并以表面的方式显示出来。
图2展示了面绘制的数据流结构。
图2面绘数据流
(1)提取等值面(MarchingCubes)
对图像进行进行提取等值面操作(分割操作),不仅需要选用合适的分割算法,还需要了解被分割对象的组织结构,如:
皮肤和骨骼的密度是不同的,并且头盖骨同其它部位的骨头密度也显然不同,根据不同组织具有不同的密度(或者灰度值)进行等值面提取操作。
经典的MarchingCubes算法的基本原理:
首先,假定原始数据是离散的三维空间规则数据场,用于医学诊断的断层扫描仪(CT)及核磁共振仪(MRI)等产生的图像均属于这一类型;其次,为了在这一数据场中构造等值面,给出所求等值面的值;最后,找出等值面经过的体元位置,求出该体元内的等值面并计算出相关参数,以便由常用的图形软件包或图形硬件提供的面绘制功能绘制等值面。
由于该方法是逐个体元依次处理的,因此被称为移动立方体法(MarchingCubes)[8]。
VTK主要提供了两种提取等值面的类vtkContourFilter滤波器和封装了MC(MarchingCubes)算法类vtkMarchingCubes,最终通过设置SetValue(arg1,arg2)实现对某轮廓组织的提取,其中arg1是提取的标号一般从0开始,arg2是提取等值面的值,所以可以同时实现多个等值面的提取操作,但由于不同组织的等值信息难以分类,所以我们在这里采用滑块(SliderControl)进行调节。
(2)数据处理
根据需要可以对读取的图像进行各种预处理或者优化操作,例如通过vtkImageThreshold对图像进行二值门限处理,将图像转换为Binary图像(黑白图像);或者通过vtkDecimatePro降低网格中三角片(纹理)的数量提高绘制速度;更为普遍的是利用VTK同ITK的图像接口itkImageToVTKImageFilter,用ITK图像处理算法对图像进行类型转换、边缘检测、平滑、分割等预处理,然后再转换为VTK可以识别的图像进行显示。
但是这些操作在某种程度上也在降低了绘制图像的质量,如:
为了提高绘制的速度,一种方法是利用ITK的Cast(投射)函数将DICOM图像转换为BMP图像,然后保存为raw类型文件,虽然提高了绘制速度,但在转换过程中已对原文件信息造成了破坏,因为DICOM图像的灰度级可以达到4096级,而BMP却远远无法达到。
所以应根据实际情况,选择合适的算法进行数据处理[3,5]。
(3)程序的核心代码
//读取2维切片序列
vtkSmartPointer
:
New();
reader->SetFilePrefix("F:
/Data/head/Bn");//设置读取文件夹head中Bn1.bmp、Bn2.bmp...Bn255.bmp切片
reader->SetFilePattern("%s%d.BMP");//切片文件名前缀格式
reader->SetDataExtent(0,255,0,255,0,255);//切片大小及切片范围
reader->SetDataSpacing(1,1,1);//数据在X、Y、Z方向上的间隔
reader->SetFileNameSliceOffset
(1);//从下标为1的切片开始读取
reader->SetFileNameSliceSpacing
(1);//切片下标间的间隔
reader->SetDataOrigin(0,0,0);//设置数据中心
//抽取等值面为的骨头的信息
vtkSmartPointer
:
New();
boneExtractor->SetInputConnection(reader->GetOutputPort());
boneExtractor->SetValue(0,80);//设置提取的等值信息
//在等值面上生成法向量
vtkSmartPointer
:
New();
boneNormals->SetInputConnection(boneExtractor->GetOutputPort());
boneNormals->SetFeatureAngle(60.0);//指定在锋利边缘的角度值
//剔除旧的或废除的数据单元,提高绘制速度
vtkSmartPointer
:
New();
boneStripper->SetInputConnection(boneNormals->GetOutputPort());
//将处理后的数据映射为可视化工具包中的图元信息
vtkSmartPointer
:
New();
boneMapper->SetInputConnection(boneStripper->GetOutputPort());
boneMapper->ScalarVisibilityOff();//设置标量不可见
3.2面绘制实验结果
实验数据来源于某骨质医院和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的绘制效果。
图4头部皮肤效果图5胸腔骨骼效果
图6头骨效果图7人体骨骼效果
3.3体绘制
体绘制不同于面绘制,面绘制需要生成中间几何图元,而体绘制是直接绘制,所以内存的需求较面绘制小,但是由于每切换一个视角需要重新对所有的像素点进行颜色、透明度等计算,所以需要的时间又比面绘制的长。
本系统利用光线投射算法进行体绘制,光线投射算法的基本原理由图8所示[4,8]。
图8光线投射算法基本原理流程图(图中字改小5宋体。
可不用图片格式便于修改)
(1)数据预处理:
常见有两种操作,一种是类型的转换,通过vtkImageShiftScale将不同类型的数据集转换为VTK可以处理的数据;另一种是剔除冗余数据,例如通过vtkStripper防止无效的旧单元的存在,提高绘制速度。
(2)数据分类:
三维数据场中的数据是三维空间中多种不同物质的测量结果或计算机数值计算的结果。
例如,在人体或动物的CT扫描图像中,对应用骨骼、肌肉和皮肤等不同密度的物质,就有不同的CT值,在CT图像中表现为具有不同的灰度值。
为了在最终的可视化图像中以不同颜色正确地表示出共存的多种物质的分布,就需要对数据进行分类,找出数据与不同物质之间的对应关系;为了在最终图像中以不同颜色表示单一物质的不同属性,如温度、密度等,也需要进行分类。
所以分类是整个可视化算法非常重要的一步,但是分类又是非常困难的,又如,人的头部同一组织结构往往具有不同的灰度值,而同一灰度值的像素又有可能属于不同的组织结构。
因此,尽管图像处理和模式识别技术对物质分类问题进行了多年研究,但仍然只能对简单的或特定的三维数据场进行自动分类。
本范例,为了方便寻找坡度或不同组织,采用滑块SliderControl进行实现,如图9所示。
图9体绘制的操作界面(背景颜色淡一点是不是效果会好?
黑白印刷看不出彩色效果)
(3)给数据点赋颜色值:
将分类后的组织信息分别予以不同的颜色,便于图像分析是非常必要的,VTK采用vtkColorTransferFunction类的AddRGBPoint()函数将不同组织信息转换为不同的颜色。
(4)给数据点赋不透明度值:
在体绘制中,需要显示三维数据场的内部结构,因而需要生成具有透明度的图像。
因此对每个体元不仅要根据分类结果赋予不同的颜色值(R,G,B),而且还要赋予不透明度值α。
α=1表示该体元完全不透明;α=0则表示完全透明。
体元颜色值由
实现,
为第i种物质所占的百分比,
为第i中物质的颜色值。
VTK采用分段函数vtkPiecewiseFunction类的AddPoint()函数实现不同组织透明度的设置。
(5)光照效应计算:
VTK中采用光线函数vtkVolumeRayCastCompositeFunction进行投射,最终用vtkVolumeRayCastM
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- KJ1185 基于 VTK 医学 图像 三维 可视化 实现 x1