VTK中光线投射法实现体绘制
基于VTK光线投射法的CT图像三维重建
jci )a dC mp se uci a —csn l r m.T eav nae addsda t e fh s refnt n e3 et n n o oi F nt ni R y at ga oi o t o n i g t h h d at s n i v a so eet e c o snt D g a n g t h u i i h
r c nsr ton w e ev ldae d c m pae e o tuci r a i t d a o n r d. T e r s l nd c t d t tt e VTK pp o c f3 viuai ai a a t o v n e c h e u ti i ae ha h a r a h o D s lz ton h sf s ,c n e i n e a g f ce c nd hih e i in y,a d t s ge o h m ho d be d p nd d on t e a plc t . n he u a ft e s ul e e e h p i ai on Key or VTK ,3D e o tuci n,CT ,r y— c sig w ds r c nsr to a a tn
Cl s m b r T 3 1 41 a s Nu e P 9 .
I 引言
可视 化工 具包 V K( i azt nT okt是 由 T Vs lai oli ui o )
了分析比 较。
2 V K绘 制 机 制 T
V K( i a zt n T ok ) 一 种 基 于 O e — T V s l a o oli 是 ui i t p n
M e n p n Zha g Hon m i LiX io e g iKa g i g n g n a fn
基于VTK的医学图像三维可视化实现
基于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 可视化工具包VTK1.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.。
vtk常用算法类
vtk常用算法类vtk常用算法类包含了许多用于可视化和图形处理的算法。
本文将介绍其中一些常用的算法类,包括数据滤波、几何变换、体绘制和体积渲染等。
1. 数据滤波算法类:vtk常用的数据滤波算法类包括高斯平滑、中值滤波、边缘检测和图像增强等。
这些算法通过对数据进行处理和转换,可以去除噪声、平滑图像、提取边缘等。
其中,高斯平滑算法通过卷积运算实现图像平滑,中值滤波算法通过取中值来去除噪声。
2. 几何变换算法类:vtk提供了许多几何变换算法类,包括旋转、平移、缩放和剪切等。
这些算法可以对几何对象进行变换,实现对象的位置、尺寸和形状的变化。
例如,平移算法可以将对象沿指定方向移动一定距离,旋转算法可以将对象绕指定轴旋转一定角度。
3. 体绘制算法类:vtk的体绘制算法类用于将体数据以三维形式显示。
常用的算法包括体绘制、等值面提取和体渲染等。
体绘制算法可以将体数据以体素的形式显示,等值面提取算法可以提取出体数据中特定数值的等值面,体渲染算法则可以通过光照和材质等效果来实现真实感的渲染。
4. 体积渲染算法类:体积渲染是一种将体数据进行透明渲染的技术,可以实现更加真实的三维效果。
vtk提供了多种体积渲染算法类,包括体积光线投影、图像空间光线投影和体绘制等。
这些算法通过对体数据进行光线追踪和投影,可以实现透明效果,并能够显示体数据内部的结构和细节。
除了以上常用算法类,vtk还提供了许多其他有用的算法类,如曲面重建、点云配准和图像分割等。
这些算法类可以帮助用户实现各种图形处理和可视化任务。
例如,曲面重建算法可以根据点云数据生成光滑的曲面模型,点云配准算法可以将多个点云数据对齐到同一坐标系,图像分割算法可以将图像分割成多个区域。
vtk常用算法类提供了丰富的功能和灵活的接口,可以满足各种可视化和图形处理的需求。
无论是进行数据滤波、几何变换、体绘制还是体积渲染,vtk都提供了相应的算法类来实现。
通过使用这些算法类,用户可以方便地进行图形处理和可视化,并得到满意的结果。
VTK技术在雷达图像可视化中的研究与应用
VTK技术在雷达图像可视化中的研究与应用摘要:利用VTK对雷达图像数据进行三维可视化研究,其中研究了表面绘制和体绘制两种绘制技术:表面绘制用移动立方体法实现,体绘制用合成光线投影算法实现。
实验高效快捷地显示了雷达二维图像,实现了雷达回波数据的空间整体三维重建显示和x,y,z三维任意切面的雷达回波强度显示,并且可以任意方向切割、旋转、放大与平移三维图像。
VTK应用于雷达图像三维可视化更为直观和全面的展现了空间回波的分布状况。
关键词:VTK;可视化;体绘制;雷达图像;光线投影算法中图分类号:TP391.4文献标识码:B文章编号:1004-373X(2010)06-122-03Study and Application in Visualization of Radar Image Based on VTKHOU Huan,HAN Lei,LIN Zhongyu(College of Information Science & Engineering,Ocean University of China,Qingdao,266100,China)Abstract:To study the radar image data′s three dimensional visualization,there are two types of rendering techniques:surface rendering and volume rendering.Surfacerendering uses marching cubes algorithm,volume rendering uses composited ray-casting algorithm.It efficiently and easily displays the two-dimensional radar image,realizes three dimensional reconstruction of radar reflectivity,achieves arbitrary x,y,z three-dimensional cross-section of the radar echo intensity display,also it can arbitrary- orienting clip,rotate,zoom and translate the three dimensional image.Applying VTK in the three dimensional visualization of radar image comprehensively displays spatial distribution of the radar echo.Keywords:VTK;visualization;volume rendering;radar image;ray-casting algorithm冰雹等强对流天气是我国的主要灾害性天气之一,给人们的生产、生活带来极大的不便与危害。
vtk渲染原理
vtk渲染原理
VTK(Visualization Toolkit)的渲染原理主要基于体绘制(Volume Rendering)技术。
体绘制是一种能够处理大规模数据集的方法,其原理是通过颜色和不透明度等属性来表示数据场中的不同值,然后对整个数据场进行渲染,从而生成三维图像。
在VTK中,体绘制的过程通常包括以下步骤:
1. 数据预处理:对原始数据进行必要的预处理,如滤波、插值、分割等,以便更好地表示数据的特征。
2. 分类映射:根据数据的不同特征,将其分为不同的类别,并为每个类别分配不同的颜色和不透明度值。
这一步是通过定义一个颜色映射表来实现的。
3. 光线投射:根据视点和数据场的位置关系,计算出光线与数据场的交点,并将交点处的颜色和不透明度值进行混合,生成最终的图像。
这一步是通过光线投射算法实现的。
4. 纹理映射:在体绘制中,纹理映射通常用于增加图像的细节和真实感。
通过将纹理图像映射到数据场的表面上,可以在渲染过程中实现更加逼真的效果。
总的来说,VTK的渲染原理是通过体绘制技术将大规模数据场转换为三维图像的过程。
通过不同的算法和技巧,VTK能够生成高质量、高分辨
率的图像,广泛应用于科学计算、医学影像等领域。
VTK体绘制
●渲染技术⏹几何渲染技术:通过绘制几何图元(顶点、线段、面片等)来渲染数据。
绘制图像时先在空间中建立一个四边形图元,然后以纹理映射的方式将图像贴图到该图元上进行渲染;绘制三维模型时通常会分解一系列的多边形面片进行绘制。
速度快,但是不能显示体数据内部的细节。
例如渲染人的三维CT体数据时,通过几何渲染只能在切片图像之间进行切换,而不能对体数据内部细节进行立体观察。
⏹体绘制:三维重建,直接利用体数据来生成二维图像的绘制技术。
与面绘制不同,体绘制不需要提取体数据内部的等值面,它是对三维体数据进行采样和合成的过程。
能通过设置不透明度值来显示体数据内部的不同成分和细节。
两种方法的不同点主要在Mapper和Actor/Volume处。
●vtkVolumeMapper:所有体绘制Mapper类的虚基类,提供接口函数,并由其子类实现具体功能。
⏹vtkVolumeRayCastMapper:光线投射法,基于图像序列的最常用的体绘制方法。
◆基本原理:从投影图像平面的每个像素沿着视线方向发射一条穿过体数据的射线,然后在射线上按照一定的步长进行等距采样,对每个采样点采用插值技术来计算其体素值,根据颜色传递函数和不透明度传递函数来获取相应的颜色值和不透明度,最后利用光线吸收模型将颜色值进行累加直至管线穿过体数据。
◆投影光线上的采样点步长:决定了体绘制的精度和速度,步长越小,采样点就越多,提高体绘制效果的同时计算量也会增加。
SetSampleDistance(float)。
调整采样步长主要考虑的因素有样本间距、标量数据以及标量数据映射的颜色和不同明度变化率。
◆图像采样间距/投影光线间隔:默认采样间距为1,每个像素对应一条投影光线;设置为0.5,每个像素对应4条投射光线;设置为2,每4个像素对应一条投影光线。
SetImageSampleDistance(float)先用SetAutoAdjustSampleDistance(0);关闭自动调整采样,默认情况下该函数的功能是开启的,以保证在图像旋转等交互时,能够自动调整采样距离以保证实时性。
VTK体绘制_光线投影+最大密度投影+等值面法
VTK体绘制_光线投影+最⼤密度投影+等值⾯法1.vtkVolumeMappervtkVolumeMapper是所有体绘制Mapper类的虚基类,提供接⼝函数,并由其⼦类实现具体功能。
该类的继承关系如下图所⽰:应该掌握⼀些常⽤的体绘制类。
2.光线投射:vtkVolumeRayCastMapper光线投射法是最常⽤的体绘制⽅法。
它是⼀种基于图像序列的直接体绘制⽅法。
光线投影法的基本原理是从投影图像平⾯(通常为平⾯)的每个像素沿着视线⽅向发射⼀条穿过体数据的射线,然后在射线上按照⼀定的步长进⾏等距采样,对每个采样点采⽤插值技术来计算其体素值,根据颜⾊传输函数和不透明度传输函数来获取相应的颜⾊值和不透明度,最后利⽤光线吸收模型将颜⾊值进⾏累加直⾄管线穿过体数据。
这样,就可以得到当前平⾯像素的渲染颜⾊,最终⽣成显⽰图像。
光线投影法的优点是能够⽐较精确地模拟原始体数据,但计算量较⼤,实时体绘制对计算机硬件的要求⽐较⾼。
在VTK中,VTKVolumeRayCastMapper类可⽤于实现光线投影体算法,并⽣成渲染图元数据传递给vtkVolume对象进⾏渲染。
vtkVolumeRayCastMapper采⽤软件⽅法来实现光线投影算法,精度⾼但是计算量⽐较⼤,因此渲染速度相对⽐较慢。
该类内部实现了两个⾮常重要的函数:vtkVolumeRayCastMapper::SetInput(vtkImageData*):该函数⽤于设置输⼊图像数据;vtkVolumeRayCastMapper::SetVolumeRayCastFunction(vtkVolumeRayCastFunction*):该类⽤于设置光线投射函数。
vtkVolumeRayCastMapper中计算每条光线在通过体数据后的颜⾊是通过定义的vtkVolumeRayCastFunction对象来实现的。
因此,必须为vtkVolumeRayCastMapper指定⼀个vtkVolumeRayCastFunction象,vtkVolumeRayCastFunction是⼀个虚基类,他包含三个⼦类。
基于VTK的体绘制三维重建方法
1 可视 化工具 V K T [ ]
可视 化工 具 V K是 由 Wiim J S h e e, en t Mat , la . oe sn三人 于 19 在 T la . c m drK n e M. rn Wii E L rne h i lm 9 3年
文献 的基础 上 , 利用 面 向对象 的建 模技 术 , 计 和实 现开 放 的 三维 可视 化工 具 箱 。Ⅵ ' 造 在 c++语 设 K构 言之上 , 括 三维计算 机 图形 学 、 包 图像处 理 和可视化 三大部 分功 能 。它包 括两 个 子 系统 : 一个 是 c++ 类 库 ; 一个是支 持 Jv 、c、yhn语 言 操作 编译 过 的 c+ +类 库 的封 装 层 。V K是 可 视化 编程 的应 用 另 aaTlPto T 库 , 可以作 为其它 不 同的 图像库 的接 口。 它 V K能够 支持 和处 理多 种表示 格 式 的数 据 。如 : 则 的或 无 规则 的点 阵 ( o t e ) 图像 (m g ) T 规 pi t 、 n ss iae 、
维普资讯
第2 4卷第 6期
V0 . 4. o 6 12 N .
・
攀枝花学院学报
J u a fP n h h a U ie st o r l o a z i u n v ri n y
20 0 7年 1 2月
De 2 7 c. OO
计 算机及 通信研 究 ・
基 于 V K的体绘 制 三 维 重 建 方 法 T
陈 欣 波
( 攀枝花学院 电气信息工程学 院 , l l l  ̄J 攀枝花 6 70 ) 10 0
摘
要
Vsa zt nT o i是一个面 向对象的可视化类 库 , i l ao ol t ui i k 它为从 事可视化 应用程 序开 发的广大科研 工作
VTK体绘制_体绘制管线图形渲染管线
VTK体绘制_体绘制管线图形渲染管线1.⼏何渲染与体绘制1.1 ⼏何渲染前⾯练习的渲染技术都是⼏何渲染技术。
所谓的⼏何渲染技术,就是通过绘制⼏何图元(顶点、线段、⾯⽚等)来渲染数据,例如:绘制图像需要在空间中建⽴⼀个四边形图元,然后以纹理映射的⽅式将该图像贴图到该图元上进⾏渲染;⽽三维模型的绘制通常会分解为⼀系列的多边形⾯⽚进⾏绘制。
这种通过⽣成中间⼏何图元来进⾏渲染的⽅法称为⼏何渲染。
⼏何渲染的速度⽐较快,但是不能显⽰体数据的内部细节。
例如:在渲染⼈的三维CT体数据时,通过⼏何渲染只能在切⽚图像之间进⾏切换,⽽不能对体数据内部细节进⾏⽴体观察。
1.2 体绘制体绘制技术,更多的时候,我们把它称为三维重建(区别于投影图像的三维重建),是⼀种直接利⽤体数据来⽣成⼆维图像的绘制技术。
与⾯绘制不同,体绘制不需要提取体数据内部的等值⾯,它是对三维体数据进⾏采样和合成的过程。
体数据能过通过设置不透明度值来显⽰体数据内部的不同成分和细节,例如显⽰⼈体CT图像的不同器官和组织。
2.图形渲染管线在进⾏体绘制管线学习之前,很有必要回顾⼀下前⾯的VTK可视化管线的基本组成。
我习惯把渲染窗⼝vtkRenderWindow看做⼀个剧院,剧院中⼀般需要灯光(vtkLight)、相机(vtkCamera)和舞台(vtkRenderer)来呈现精彩的演出。
舞台上负责表演的⾃然就是演员(vtkActor),⽽且演员往往不⽌⼀个,可以根据需要为舞台加⼊更多的演员(vtkActor)。
每个演员⼜各具特⾊,⽽⽤来表⽰其特⾊的则是vtkProperty(负责控制值颜⾊、材质和不透明度等);每个vtkActor的数据和渲染信息存储在⼀个vtkMapper对象中,负责将原始数据转换为渲染所需要的图元数据。
3.体绘制管线从可视化管线的组成上来讲,体绘制的渲染管线与⼏何渲染管线基本⼀致,先通过⼀个实例进⾏初步认识:1 #include <vtkAutoInit.h>2 VTK_MODULE_INIT(vtkRenderingOpenGL);3 VTK_MODULE_INIT(vtkRenderingVolumeOpenGL); //错误:no override found for 'vtkRayCastImageDisplayHelper'.4 VTK_MODULE_INIT(vtkRenderingFreeType);5 VTK_MODULE_INIT(vtkInteractionStyle);67 #include <vtkSmartPointer.h>8 #include <vtkStructuredPoints.h>9 #include <vtkStructuredPointsReader.h>10 #include <vtkFixedPointVolumeRayCastMapper.h>11 #include <vtkColorTransferFunction.h>12 #include <vtkPiecewiseFunction.h>13 #include <vtkRenderer.h>14 #include <vtkRenderWindow.h>15 #include <vtkRenderWindowInteractor.h>16 #include <vtkVolumeProperty.h>17 #include <vtkAxesActor.h>18 #include <vtkOrientationMarkerWidget.h>1920int main(int argc, char *argv[])21 {22 vtkSmartPointer<vtkStructuredPointsReader> reader =23 vtkSmartPointer<vtkStructuredPointsReader>::New();24 reader->SetFileName("mummy.128.vtk");25 reader->Update();262728 vtkSmartPointer<vtkFixedPointVolumeRayCastMapper> volumeMapper =29 vtkSmartPointer<vtkFixedPointVolumeRayCastMapper>::New();30 volumeMapper->SetInputData(reader->GetOutput());3132//设置光线采样距离33//volumeMapper->SetSampleDistance(volumeMapper->GetSampleDistance()*4);34//设置图像采样步长35//volumeMapper->SetAutoAdjustSampleDistances(0);36//volumeMapper->SetImageSampleDistance(4);37/*************************************************************************/38 vtkSmartPointer<vtkVolumeProperty> volumeProperty =39 vtkSmartPointer<vtkVolumeProperty>::New();40 volumeProperty->SetInterpolationTypeToLinear();41 volumeProperty->ShadeOn(); //打开或者关闭阴影测试42 volumeProperty->SetAmbient(0.4);43 volumeProperty->SetDiffuse(0.6); //漫反射44 volumeProperty->SetSpecular(0.2); //镜⾯反射45//设置不透明度46 vtkSmartPointer<vtkPiecewiseFunction> compositeOpacity =47 vtkSmartPointer<vtkPiecewiseFunction>::New();48 compositeOpacity->AddPoint(70, 0.00);49 compositeOpacity->AddPoint(90, 0.40);50 compositeOpacity->AddPoint(180, 0.60);51 volumeProperty->SetScalarOpacity(compositeOpacity); //设置不透明度传输函数52//compositeOpacity->AddPoint(120, 0.00);//测试隐藏部分数据,对⽐不同的设置53//compositeOpacity->AddPoint(180, 0.60);54//volumeProperty->SetScalarOpacity(compositeOpacity);55//设置梯度不透明属性56 vtkSmartPointer<vtkPiecewiseFunction> volumeGradientOpacity =57 vtkSmartPointer<vtkPiecewiseFunction>::New();58 volumeGradientOpacity->AddPoint(10, 0.0);59 volumeGradientOpacity->AddPoint(90, 0.5);60 volumeGradientOpacity->AddPoint(100, 1.0);61 volumeProperty->SetGradientOpacity(volumeGradientOpacity);//设置梯度不透明度效果对⽐ 62//设置颜⾊属性63 vtkSmartPointer<vtkColorTransferFunction> color =64 vtkSmartPointer<vtkColorTransferFunction>::New();65 color->AddRGBPoint(0.000, 0.00, 0.00, 0.00);66 color->AddRGBPoint(64.00, 1.00, 0.52, 0.30);67 color->AddRGBPoint(190.0, 1.00, 1.00, 1.00);68 color->AddRGBPoint(220.0, 0.20, 0.20, 0.20);69 volumeProperty->SetColor(color);70/********************************************************************************/71 vtkSmartPointer<vtkVolume> volume =72 vtkSmartPointer<vtkVolume>::New();73 volume->SetMapper(volumeMapper);74 volume->SetProperty(volumeProperty);7576 vtkSmartPointer<vtkRenderer> ren = vtkSmartPointer<vtkRenderer>::New();77 ren->SetBackground(0, 1, 0);78 ren->AddVolume(volume);7980 vtkSmartPointer<vtkRenderWindow> rw = vtkSmartPointer<vtkRenderWindow>::New();81 rw->AddRenderer(ren);82 rw->SetSize(640, 480);83 rw->Render();84 rw->SetWindowName("VolumeRendering PipeLine");8586 vtkSmartPointer<vtkRenderWindowInteractor> rwi =87 vtkSmartPointer<vtkRenderWindowInteractor>::New();88 rwi->SetRenderWindow(rw);89/********************************************************************************/90//vtkSmartPointer<vtkAxesActor> axes = vtkSmartPointer<vtkAxesActor>::New();91//axes->SetScale(10);92//vtkSmartPointer<vtkOrientationMarkerWidget> widget =93// vtkSmartPointer<vtkOrientationMarkerWidget>::New();94//widget->SetOutlineColor(1, 1, 1);95//widget->SetViewport(0, 0, 0.2, 0.2);96//widget->SetOrientationMarker(axes);97//widget->SetInteractor(rwi);98//widget->SetEnabled(1);99//widget->InteractiveOn();100101 ren->ResetCamera();102 rw->Render();103 rwi->Start();104105return0;106 }#vtkVolumeRayCastMapper:vtkVolumeRayCastMapper定义了⼀个光线投影体绘制Mapper,其主要接受如下两个输⼊。
使用 vtk体绘制中常用的光线投射算法
使用 vtk体绘制中常用的光线投射算法使用vtk体绘制中常用的光线投射算法光线投射算法是一种常用的图形学算法,用于模拟光线在三维场景中的传播和交互。
在vtk体绘制中,光线投射算法被广泛应用于体数据的可视化和分析。
光线投射算法基于光线与物体之间的相互作用,通过追踪光线的路径和计算光线与物体的交点来生成图像。
在vtk中,常用的光线投射算法包括体素光线投射、等值面提取和体绘制。
体素光线投射是一种基于体素的光线投射算法,它通过在体数据中追踪光线的路径来实现体的可视化。
该算法首先将体数据划分为一组体素,然后根据光线与体素的交点来计算光线的颜色和透明度。
通过对每个像素进行光线投射计算,可以得到包含体数据信息的图像。
vtk中提供了多种体素光线投射算法的实现,如多通道体素光线投射、多层次体素光线投射等。
等值面提取是一种基于等值面的光线投射算法,它通过在体数据中提取等值面并对等值面进行光线投射计算来实现体的可视化。
等值面是指与体数据中特定数值相等的曲面,它可以用来表示体数据中的特定结构或属性。
通过对等值面进行光线投射计算,可以得到包含等值面信息的图像。
vtk中提供了多种等值面提取算法的实现,如Marching Cubes等。
体绘制是一种基于体数据的光线投射算法,它通过在体数据中追踪光线的路径来实现体的可视化。
与体素光线投射不同,体绘制算法不需要对体数据进行划分,而是直接对体数据进行光线投射计算。
该算法通过追踪光线的路径并计算光线与体数据的交点来生成体绘制图像。
vtk中提供了多种体绘制算法的实现,如体绘制、直接体绘制等。
在vtk中,使用光线投射算法进行体绘制可以通过以下步骤实现:1. 加载体数据:首先需要加载体数据,可以是常见的体数据格式,如DICOM、VTK等。
2. 创建光线投射器:根据需要选择合适的光线投射算法,并创建对应的光线投射器对象。
3. 设置光线投射参数:根据需要设置光线投射器的参数,如光线起点、方向、步长等。
VTK中光线投射法实现体绘制
VTK中光线投射法实现体绘制【转】VTK中光线投射法实现体绘制1、体绘制函数VTK 为使用者提供了三种用于光线投射法的函数分别是:等值面绘制函数(vtkVolumeRayCastIsosurfaceFunction);最大密度投影函数(vtkVolumeRayCastMIPFunction);合成体绘制函数(vtkVolumeRayCastCompositeFunction)其中最常用的是合成体绘制函数,最大密度投影函数在显示血管影像方面有比较好的作用。
但是如图所看到的,MIP函数没有空间立体感,也就是不能提供深度的信息。
2、不透明度映射函数不透明度映射函数是设置光线方向上的灰度值及其不透明度映射。
vtkPiecewiseFunction *opacityTransferFunction = vtkPiecewiseFunction::New(); opacityTransferFunction->AddPoint(10, 0.0);//灰度值及不透明度值opacityTransferFunction->AddPoint(50,0.1);opacityTransferFunction->AddPoint(200 ,0.1);opacityTransferFunction->AddPoint(2900,0.1);opacityTransferFunction->AddPoint(2950,0.8);opacityTransferFunction->AddPoint(3050,1);//不透明度值为1则为完全不透明opacityTransferFunction->ClampingOff();3、颜色映射函数颜色映射函数是设置灰度值与RGB颜色的映射。
vtkColorTransferFunction *colorTransferFunction = vtkColorTransferFunction::New();colorTransferFunction->AddRGBPoint(0.0, 0.91, 0.65, 0.66); //灰度值及RGB颜色值colorTransferFunction->AddRGBPoint(30.0, 0.91, 0.65, 0.66); colorTransferFunction->AddRGBPoint(128.0, 0.91, 0.65, 0.66); colorTransferFunction->AddRGBPoint(1200.0, 0.43, 0.43, 0.43); colorTransferFunction->AddRGBPoint(1800.0, 0.43, 0.43, 0.43); colorTransferFunction->AddRGBPoint(2950, .9, 0.0, 0.0); colorTransferFunction->AddRGBPoint(3050, .9, 0.0, 0.0); colorTransferFunction->ClampingOff();4、梯度变换函数梯度变换函数设置灰度值变换的大小与不透明度之间的映射。
vtk中两个面连接成体的算法
在VTK(Visualization Toolkit)中,两个面连接成体的算法主要依赖于体绘制(volume rendering)和体素生成(isosurface generation)的方法。
具体来说,这个过程可以通过以下步骤完成:
1. 从数据集中提取出两个面的三维数据。
2. 根据这两个面的三维数据,创建一个体素数据集。
体素是一种将三维空间划分成一系列小的立方体(体素),并为每个体素分配一个值的计算方法。
在这个过程中,每个体素的值为其内部的面数据点的平均值或其它特定的计算方法得到的结果。
3. 使用光线投射算法(Ray-casting)进行体绘制。
光线投射算法从图像平面的每个像素点出发,沿着视线方向发出一条射线,此射线穿过体数据集,按一定步长进行采样,由内插计算每个采样点的颜色值和不透明度,然后由前向后或由后向前逐点计算累计的颜色值和不透明度值,直至光线完全被吸收或穿过物体。
在光线投射算法中,主要涉及到的是传递函数(transfer function)的概念。
传递函数通常被用来对不同的单元(如面、点、体等)加上颜色(RGB)和不透明度(opacity)。
4. 在体绘制的过程中,对于两个面连接的部分,由于其内部包含的体素颜色值和不透明度在两个面之间是连续变化的,因此可以在视觉上看到这两个面连接成了一个体。
以上就是VTK中两个面连接成体的基本算法。
需要注意的是,实
际的操作过程中可能会有许多优化和细节处理,例如在对体素数据集进行采样时,可能需要根据实际情况选择更高效的采样方法;在计算颜色值和不透明度时,可能需要根据实际的数据特点选择更合适的传递函数等。
基于CT数据的三维重构
基于CT数据的三维重构摘要医学CT数据的可视化在临床上已经成为辅助诊断与治疗的重要手段之一,可视化是由一系列CT扫描后的二维图象数据重构出三维模型的技术手段,最后在计算机上显示出来。
医生能够通过观察三维图像来获取患者病变的组织信息,这极大方便了医生的诊断,提高了医学诊断结果的正确性和治疗的质量。
因此,可视化技术也成为近年来研究和应用的热点方向。
在此基础上,提出采用VTK库进行医学数据的可视化。
论文中重点研究了表面绘制和体绘制两种绘制方法。
表面绘制采用移动立方体算法(Marching Cubes)实现,体绘制则用光线投射算法(Ray-casting)实现,并且通过比较两种算法的结果讨论了他们的特点。
从重构模型中可以看出,VTK作为一种流行的图像处理和三维可视化工具,其功能是非常强大的。
关键词:CT;三维重构;体绘制3D Reconstruction based on CT DataABSTRACTVisualization for medical CT data has been one of the important methods to aided diagnosis, and treat in the clinical.This technical can reconstruct the 3D models from a series of 2D images, then the data is being displayed by the computer.This greatly convenient diagnosis of the doctor's. And improved the accuracy of medical diagnosis treat and the treatment quality.So,visualization technology to become the hot spot of application and research in recent years.On this basis it is proposed that VTK library is used for visualization for medical data.Two types of rendering method,surface rendering and volume rendering are studied in the paper.The marching cubes algorithm is used for surface rendering,both ray-casting methods are used for volume rendering.In additional,by comparing two algorithms and the results obtained their characteristics.The reconstructed results showed that as a visualization tools,VTK has powerful function and it is very easy to be used for medical images processing.Key words: CT;3D reconstruction; Momposited volume rendering目录1 绪论 (5)1.1 课题的研究背景 (5)1.2 国内外研究现况 (5)1.3 论文的结构 (6)2可视化工具VTK (7)2.1 VTK的特点 (7)2.2 VTK的安装 (8)2.2.1 工具包的安装 (8)2.2.2 Cmake的配置 (8)2.3 VTK的结构和运行机制 (10)2.3.1 VTK的结构 (10)2.3.2 VTK的运行机制 (12)2.3.3 利用VTK对数据进行可视化 (12)2.4 小结 (13)3 CT图像的三维重构 (14)3.1 CT图像的获取与预处理 (14)3.2 三维重构流程 (15)3.3 三维重构的主要方法 (16)3.3.1 面绘制法 (16)3.3.2体绘制方法 (19)3.4 两种重构法的对比 (23)3.5 小结 (18)4 展望与总结 (19)参考文献 (26)致谢..................................... 错误!未定义书签。
VTK中的体绘制方法
基于VolumePro硬件辅助的体绘制方法,成像质量虽然不及光线投射法,但是要比二维纹理映射好。利用VolumePro硬件支持的体绘制速度是最快的,一般每秒至少20帧画面,但目前只支持平行投影且价格昂贵。
每种技术各有其优点和缺点,开发人员应该根据实际需要进行选择。就目前看来,VTK中的光线投射法是应用最多的。这是因为不仅它的成像质量是最好的,而且随着计算机技术的发展和算法的不断改进,其绘制能力也在不断提高。二维纹理映射受限于其成像质量和图形硬件,VolumePro更是由于其价格原因使用较少。
VTK中的光线投射法
(1)不透明度传递函数。该函数确定各体素或单位长度值的不透明度;
(2)颜色传递函数。该函数确定体素的颜色值或者灰度值;
(3)梯度传递函数。该函数确定不同梯度值的不透明度,从而突出不同组织之间的结构和相互之间的层次关系。
在VTK中,使用vtkPiecewiseFunction类来实现传递函数的设计,使用该类中的AddPoint和AddSegment函数来实现数值点的添加。一个简单的传递函数的设计如以下代码所示:
在上述代码中,只需要对最大密度投影函数vtkVolumeRayCastMIPFunction和等值面绘制函数vtkVolumeRayCastIsosurfaceFunction分别初始化,在vtkVolumeRayCastMapper类中的SetVolumeRayCastFunction函数里将体绘制的方法分别进行替换即可实现最大密度投射体绘制和等值面体绘制。
【引用】VTK体绘制
【引用】VTK体绘制【引用】VTK体绘制#pragma comment (lib, "vtkCommon.lib")void main(){vtkRenderer *ren = vtkRenderer::New();//设置绘制者(绘制对象指针)vtkRenderWindow *renWin = vtkRenderWindow::New();//设置绘制窗口renWin->AddRenderer(ren);//将绘制者加入绘制窗口vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();//设置绘制交互操作窗口的iren->SetRenderWindow(renWin);//将绘制窗口添加到交互窗口vtkInteractorStyleTrackballCamera *style = vtkInteractorStyleTrackballCamera::New();//交互摄像机iren->SetInteractorStyle(style);//style为交互模式//raw 图片vtkImageReader *reader = vtkImageReader::New(); reader->SetFileName("D:\\CT\\mrientricles.raw");reader->SetFileDimensionality(3);//设置显示图像的维数reader->SetDataScalarType(VTK_UNSIGNED_CHAR);//VTK_UNSIGNED_short将数据转换为unsigned char型reader->SetDataExtent(0,255,0,255,0,123);//图片属性图片像素256x256,最后两参数表示有124张图reader->SetDataSpacing (0.9,0.9,0.9); //设置像素间间距reader->SetDataOrigin(0.0, 0.0, 0.0);//设置基准点,(一般没有用)做虚拟切片时可能会用的上//读取DICOM数据/*vtkV olume16Reader *reader=vtkV olume16Reader::New(); reader->SetDataDimensions (64,64);//设置图像像素值reader->SetImageRange (1,93); //设置图片数量(读取切片的起始端)reader->SetDataByteOrderToLittleEndian();//指明读入字节顺序(可有可无)reader->SetFilePrefix("C:\\Program Files\\VTK5.4\\vtkdata\\Data\\headsq\\quarter");//设置数据路径reader->SetDataSpacing (3.2,3.2,1.5); //设置像素间距reader->SetDataOrigin(0.0, 0.0, 0.0);//设置基准点*//*vtkDICOMImageReader *reader = vtkDICOMImageReader::New();reader->SetDataByteOrderToLittleEndian();reader->SetDirectoryName("D:\\CT\\dcm\\");reader->SetDataSpacing(3.2, 3.2, 1.5);reader->SetDataOrigin(0.0, 0.0, 0.0);//设置基准点*/// BMP图片/* vtkBMPReader *reader = vtkBMPReader::New(); reader->SetDataExtent(0,175,0,135,1,3);//其中最后一个参数20 就表示我的图像序列有20张图像reader->SetFilePrefix("D:\\CT\\A");reader->SetDataSpacing (1, 1, 2);//像素间的间隔reader->SetDataOrigin(0.0,0.0,0.0);reader->SetAllow8BitBMP (8) ;//很重要设置读入的bmp 图片是8位reader->Allow8BitBMPOff();//标志*/// PNG图片/* vtkPNGReader *reader = vtkPNGReader::New();reader->SetDataByteOrderToLittleEndian();reader->SetFileName("D:\\CT\\\\png\\fullhead15.png");//一张,多张SetFilePrefixreader->SetDataSpacing(3.2, 3.2, 1.5);reader->SetDataOrigin(0.0,0.0,0.0);*//* //JPEG图片vtkJPEGReader *reader = vtkJPEGReader::New();reader->SetDataByteOrderToLittleEndian();reader->SetFileDimensionality(3);reader->SetFileName("D:\\CT\\jpg\\masonry-wide.jpg"); reader->SetHeaderSize(0);reader->SetDataSpacing(3.2, 3.2, 1.5);reader->SetDataOrigin(0.0,0.0,0.0);*/vtkImageCast *readerImageCast = vtkImageCast::New();//数据类型转换readerImageCast->SetInputConnection(reader->GetOutpu tPort());readerImageCast->SetOutputScalarTypeToUnsignedShort ();readerImageCast->ClampOverflowOn();//阀值//reader->Delete();//设置不透明度传递函数//该函数确定各体绘像素或单位长度值的不透明度vtkPiecewiseFunction *opacityTransferFunction = vtkPiecewiseFunction::New();//一维分段函数变换opacityTransferFunction->AddPoint(20, 0.0); opacityTransferFunction->AddPoint(255, 0.2);//设置颜色传递函数//该函数确定体绘像素的颜色值或者灰度值vtkColorTransferFunction *colorTransferFunction = vtkColorTransferFunction::New();colorTransferFunction->AddRGBPoint(0.0, 0.0, 0.5, 0.0);//添加色彩点(第一个参数索引)colorTransferFunction->AddRGBPoint(60.0, 1.0, 0.0, 0.0);colorTransferFunction->AddRGBPoint(128.0, 0.2, 0.1, 0.9);colorTransferFunction->AddRGBPoint(196.0, 0.27, 0.21, 0.1);colorTransferFunction->AddRGBPoint(255.0, 0.8, 0.8, 0.8);vtkV olumeProperty *volumeProperty =vtkV olumeProperty::New();//设定一个体绘容器的属性volumeProperty->SetColor(colorTransferFunction);//设置颜色volumeProperty->SetScalarOpacity(opacityTransferFunction );//不透明度volumeProperty->ShadeOn();//影阴volumeProperty->SetInterpolationTypeToLinear();//直线与样条插值之间逐发函数volumeProperty->SetAmbient(0.2);//环境光系数volumeProperty->SetDiffuse(0.9);//漫反射volumeProperty->SetSpecular(0.2);//高光系数volumeProperty->SetSpecularPower(10); //高光强度//定义光线投射方法为MIP体绘制方法,MIP为体绘制经典算法// vtkV olumeRayCastMIPFunction*mipRaycastFunction =vtkV olumeRayCastMIPFunction::New();//mipRaycastFunction->SetMaximizeMethodToOpacity(); vtkV olumeRayCastCompositeFunction *compositeFunction = vtkV olumeRayCastCompositeFunction::New();//运行沿着光线合成//定义绘制者vtkV olumeRayCastMapper *volumeMapper =vtkV olumeRayCastMapper::New(); //体绘制器volumeMapper->SetVolumeRayCastFunction(compositeFun ction); //载入绘制方法volumeMapper->SetInputConnection(readerImageCast-> GetOutputPort());//图像数据输入volumeMapper->SetNumberOfThreads(3);//定义V olumevtkV olume *volume = vtkV olume::New();//表示透示图中的一组三维数据volume->SetMapper(volumeMapper);volume->SetProperty(volumeProperty);//设置体属性//保存vtkV olumeWriter *wSP=vtkV olumeWriter::New();wSP->SetInputConnection(readerImageCast->GetOutput Port());wSP->SetFileName("e://ct/mmmm.vtk");wSP->Write();wSP->Delete();ren->AddV olume(volume);//将Volume装载到绘制类中ren->SetBackground(1, 1, 1);renWin->SetSize(600, 600);//设置背景颜色和绘制窗口大小renWin->Render();////窗口进行绘制iren->Initialize();iren->Start();//初始化并进行交互绘制ren->ResetCameraClippingRange (); volumeMapper->Delete();//释放类存readerImageCast->Delete();iren->Delete();ren->Delete();renWin->Delete();opacityTransferFunction->Delete();volumeProperty->Delete(); compositeFunction->Delete(); volume->Delete(); colorTransferFunction->Delete(); }。
三维地质数据的体绘制研究
图形空 间为序的体绘制方法和以对象空间 为序的体绘制方法 。以对象空 间为序的典 型体绘制方法是单元投影算法 ,而以 图形
空 间为序的典型算法是光线投射算法。光 线投射算法是通过对从像素点发出的射线 采样 、 合成而形成完整图形的过程 。 该算法 具有算法成熟 、生成 图形效果好的优点得 到 了广泛地应用 ,体绘制方法在实际应用 中也是以光线投射算法居多。 VTK (iu l a in o l k t vs ai to t o i)完 z 整地封装 了光线投射算法 ,利用图形库 V K可以比较容易地实现对复杂数据体 T 的体绘制 。 TK是 由wi c re e等 V l Sh od r l
本 文 在 vO Um aPPe 中 设 置 1 eM r
Auo js a lD sa cs n,可 以 利 tAdut mpe itn eO S 用 S t mpe i a c es a lD s n e函数根 据 机 器配 置 设 t
柞 。 本 囊讨论 了体 绘制 的源理 ,并 采用 V K工具 T 包提供 的体绘 制方 法 中的 光线投 射 算法 ,利
观鼍 史 详 细 的 信 息 体 制 ;光线 投 射算法 ;V K;三维地质 数 棼 T
撬
置合适 的采样距离 ,这样生成的体绘制图 形 在 配置 较 低 的 机 器 上 显 示 时 ,具 有 良好
的绘制速 度,在配置较高的机器上则可 以 在快速绘制的基础上达到非常良好 的视觉 空域体绘制方法其实都是基 于光线投 从而实现 了体绘制的快速绘制 , 而且 射 的 原 理 ,但 是 由于 显 示 过 程 的 不 同 可 以 效果 , 分为两种 。一种是 以像素顺序进行的 ,处 理完 一个 像素后再处理 另一个像素 。另一 种处理过程则是处理完一个体元后在处理 另一 个 体 元 。一 般 把 这 两 种 绘 制 方 法 称 为
VTK中的体绘制方法[修订]
VTK中的体绘制方法VTK中的体绘制方法VTK最初是针对医疗领域的应用而设计的,所以对于医疗的可视化方面,如处理CT的扫描数据等,具有强大的功能。
它将在可视化过程中经常遇到的细节屏蔽起来,并封装了一些常用的可视化算法,如将面绘制中常用的MC(Marching Cubes)算法和体绘制中常用的光线投射(Ray-Casting)算法封装成类的形式提供给使用者。
这样在进行医学体数据的可视化时就可以直接使用VTK中已提供的相关类。
VTK主要提供了三种体绘制技术,除了光线投射法外,还有二维纹理映射和基于VolumePro硬件辅助的体绘制。
光线投射法是一种基于图像空间扫描的,生成高质量图像的典型的体绘制算法,基本思想是从图像平面的每个像素都沿着视线方向发出一条射线,此射线穿过体数据集,按一定步长进行采样,由内插计算每个采样点的颜色值和不透明度,然后由前向后或由后向前逐点计算累计的颜色值和不透明度值,直至光线完全被吸收或穿过物体。
该方法能很好地反映物质边界的变化,使用Phong模型,引入镜面反射、漫反射和环境反射能得到很好的光照效果,在医学上可将各组织器官的性质属性、形状特征及相互之间的层次关系表现出来,从而丰富了图像的信息。
二维纹理映射与光线投射法不同,它是基于物体空间扫描的,也就是对物体空间的数据点加以处理,计算每个数据点对屏幕像素的贡献并加以合成,形成最终的图像。
它的绘制速度比光线投射法快上5~10倍,但是成像质量远不及采用三线性插值的光线投射法精确,当视角改变时还会产生伪迹。
基于VolumePro硬件辅助的体绘制方法,成像质量虽然不及光线投射法,但是要比二维纹理映射好。
利用VolumePro硬件支持的体绘制速度是最快的,一般每秒至少20帧画面,但目前只支持平行投影且价格昂贵。
每种技术各有其优点和缺点,开发人员应该根据实际需要进行选择。
就目前看来,VTK中的光线投射法是应用最多的。
这是因为不仅它的成像质量是最好的,而且随着计算机技术的发展和算法的不断改进,其绘制能力也在不断提高。
基于VTK的体绘制系统实现
基于VTK的体绘制系统实现
李婧;李昌华
【期刊名称】《现代电子技术》
【年(卷),期】2008(31)12
【摘要】可视化是在信息化进程中发展起来的一个全新领域,VTK是一个功能强大的可视化工具包.体绘制技术作为可视化最活跃的领域之一,其算法不断得到改进和完善.简要介绍VTK的功能和应用,描述几种不同的绘制算法,并在此基础上用TCL 语言实现一个简单的基于VTK的体绘制系统,给出具体设计实现过程.该系统实现体绘制技术中4种不同的算法,为VTK工具包更好地应用于可视化领域提供了实践基础.
【总页数】4页(P88-90,97)
【作者】李婧;李昌华
【作者单位】西安建筑科技大学,信息与控制工程学院,陕西,西安710055;西安建筑科技大学,信息与控制工程学院,陕西,西安710055
【正文语种】中文
【中图分类】TP391
【相关文献】
1.基于Android和VTK的医学图像可视化系统设计与实现 [J], 李健壮;鲍苏苏;高旋辉;邱文超
2.基于VTK三维地震数据体绘制系统框架 [J], 李大勇;路游
3.基于VTK的医学图像体绘制及交互实现 [J], 陈洁敏
4.基于VTK的颌面缺损修复的计算机辅助设计系统的实现 [J], 刘洋;白石柱;张曦;李宝娟;张国鹏;卢虹冰
5.基于VTK的三维医学影像可视化系统设计与实现 [J], 孙浩; 雒伟群
因版权原因,仅展示原文概要,查看原文内容请购买。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VTK中光线投射法实现体绘制【转】
VTK中光线投射法实现体绘制
1、体绘制函数
VTK 为使用者提供了三种用于光线投射法的函数分别是:
等值面绘制函数(vtkVolumeRayCastIsosurfaceFunction);
最大密度投影函数(vtkVolumeRayCastMIPFunction);
合成体绘制函数(vtkVolumeRayCastCompositeFunction)
其中最常用的是合成体绘制函数,最大密度投影函数在显示血管影像方面有比较好的作用。
但是如图所看到的,MIP函数没有空间立体感,也就是不能提供深度的信息。
2、不透明度映射函数
不透明度映射函数是设置光线方向上的灰度值及其不透明度映射。
vtkPiecewiseFunction *opacityTransferFunction = vtkPiecewiseFunction::New(); opacityTransferFunction->AddPoint(10, 0.0);//灰度值及不透明度值opacityTransferFunction->AddPoint(50,0.1);
opacityTransferFunction->AddPoint(200 ,0.1);
opacityTransferFunction->AddPoint(2900,0.1);
opacityTransferFunction->AddPoint(2950,0.8);
opacityTransferFunction->AddPoint(3050,1);//不透明度值为1则为完全不透明opacityTransferFunction->ClampingOff();
3、颜色映射函数
颜色映射函数是设置灰度值与RGB颜色的映射。
vtkColorTransferFunction *colorTransferFunction = vtkColorTransferFunction::New();
colorTransferFunction->AddRGBPoint(0.0, 0.91, 0.65, 0.66); //灰度值及RGB颜色值
colorTransferFunction->AddRGBPoint(30.0, 0.91, 0.65, 0.66); colorTransferFunction->AddRGBPoint(128.0, 0.91, 0.65, 0.66); colorTransferFunction->AddRGBPoint(1200.0, 0.43, 0.43, 0.43); colorTransferFunction->AddRGBPoint(1800.0, 0.43, 0.43, 0.43); colorTransferFunction->AddRGBPoint(2950, .9, 0.0, 0.0); colorTransferFunction->AddRGBPoint(3050, .9, 0.0, 0.0); colorTransferFunction->ClampingOff();
4、梯度变换函数
梯度变换函数设置灰度值变换的大小与不透明度之间的映射。
vtkPiecewiseFunction *gradient=vtkPiecewiseFunction::New();
gradient->AddPoint(50,.2);//灰度值变化梯度与不透明度的关系
gradient->AddPoint(1500,.7);
gradient->AddPoint(2000,.1);
5、体数据属性设置
vtkVolumeProperty *volumeProperty = vtkVolumeProperty::New(); volumeProperty->SetColor(colorTransferFunction);//载入颜色映射函数volumeProperty->SetScalarOpacity(opacityTransferFunction);//载入不透明度映
射
volumeProperty->SetGradientOpacity(gradient);//载入梯度映射volumeProperty->ShadeOn();
volumeProperty->SetInterpolationTypeToLinear();//采用线性插值
6、光线投射函数设置及体绘制映射
本程序采用合成体绘制函数:
vtkVolumeRayCastCompositeFunction*compositeFunction= vtkVolumeRayCastCompositeFunction::New();
vtkVolumeRayCastMapper *volumeMapper = vtkVolumeRayCastMapper::New();
volumeMapper->SetVolumeRayCastFunction(compositeFunction);//载入体绘制
方法
volumeMapper->SetInput(append->GetOutput());//载入图像数据volumeMapper->SetSampleDistance(.5);
vtkVolume *volume = vtkVolume::New();
volume->SetMapper(volumeMapper);//设置映射
volume->SetProperty(volumeProperty);//设置属性。