资源描述
环境信息可视化 第七讲三维标量场等值面可视化 第二套作业的说明1 设置颜色vtkLookupTable的用法:(1)设置标量的范围,vmin,vmax(2)设置查找表项的数目,n(3)设置每一项的颜色。绘制时,任一标量值v,按如下方式从查找表中取得颜色:(1)计算等值线的间距 vd=(vmax-vmin)/(n-1)(2)计算标量值v对应的颜色在查找表中的索引值 i=(v-vmin)/vd如果ivmax,i=n-1(3)根据索引值从查找表中获得颜色值例如:标量值范围是100500,显示100,300,400,500共4种等值线,显然把等值线的间距设置为100是合理的,故查找表项的数目应为5,100,300,400,500对应的索引号为0,2,3,4环境信息可视化 第七讲三维标量场等值面可视化 Iut1=vtkLookupTable()Iut1.SetTableRange(100,500)Iut1.SetNumberOfTableValues(5)Iut1.SetTableValue(0,0.0,0.0,1.0,1.0)Iut1.SetTableValue(2,1.0,1.0,0.0,1.0)Iut1.SetTableValue(3,0.0,1.0,0.0,1.0)Iut1.SetTableValue(4,1.0,0.0,0.0,1.0)contMapper=vtkPolyDataMapper()()contMapper.SetScalarRange(100,500)contMapper.SetLookupTable(Iut1)contMapper.UseLookupTableScalarRangeOn()/Off()contActor=vtkActor()contActor.SetMapper(contMapper)环境信息可视化 第七讲三维标量场等值面可视化 2 相机的设置中为什么须添加()?绘制器的 ResetCamera方法根据当前相机的位置和焦点平移并缩放相机,使得整个场景都能显示出来。如果设置完相机后看不到场景,可以调用ResetCamera。或在窗口上按r键。环境信息可视化 第七讲三维标量场等值面可视化 3 文件路径问题在用vtk作可视化时要注意文件路径的设置。由于vtk是多平台的可视化系统开发库,为保证在所有系统上正确运行,文件的路径设置按照unix的规范进行。在微软平台下,路径设置方式为:当前路径下:./或 某路径下:环境信息可视化 第七讲三维标量场等值面可视化 4 vtkLODActor多层次细节每个多层次细节多层细节演员对象可以包含多个映射器对象,如demActor.AddLODMapper(demMapperlod)当在鼠标交互过程中,vtk系统根据系统的速度确定使用哪一个层次的显示。环境信息可视化 第七讲三维标量场等值面可视化 上一节课内容回顾6.1 拓扑重构6.2 三角片表面几何重构6.3 连续表面重构6.4 体的重构环境信息可视化 第七讲三维标量场等值面可视化 三维断层扫描数据场是最简单的三维标量场,等高线等可看成三维断层数据进行处理。三维断层重构过程分为拓扑重构和几何重构两部分。拓扑重构采用嵌套树表示断层上轮廓线的相对位置,用分类图表示层间轮廓线的拓扑关系枚举算法列出了所有有效的分类图,采用轮廓线的相似性和相对位置等约束来排除大量无意义的分类图,以推导出正确的分类图。几何重构有面向曲面的重构和面向体的重构。面向曲面的重构中最常用的是三角片表面重构,对应拓扑重构的四种基本分叉,有四种基本表面段的表面重构:极值点、圆柱、独立分叉和连通分叉。由于两相邻断层轮廓线间的表面重构等同于有向图G中寻找一条从(0,0)到(m-1,n-1)的路经。利用放样技术生成具有C2连续的表面重构算法。面向体的重构有Delaunay四面体重构和正六面体空间。环境信息可视化 第七讲三维标量场等值面可视化 断层扫描数据广泛地存在于医学、生物、地学、环境等应用领域,是一种最简单的三维标量场。如果各断层问是相互平行的,每一断层与实体的交线就是实体在该断层上的轮廓线,也就是二维平面上一条封闭的无自交的等值线,如图61所示如原始数据是光栅图像形式,在每一断层上轮廓线表现为由连续的两相临点间线段组成的一组简单封闭的直线线段,也就是一个封闭多边形链。图6.1 实体与断层环境信息可视化 第七讲三维标量场等值面可视化 断层数据的表面重构是从一系列断面上的轮廓线中推导出相断层数据的表面重构是从一系列断面上的轮廓线中推导出相应实体的空间几何结构应实体的空间几何结构 为了保证推导的正确性和唯一性,要求:实体的边界是由二维点组成;要求实体与平面的交是二维的。图6.4(a)中的点P不是二维点,图(b)中实体a和c不符合与平面的交是二维的条件,只有图(b)中实体b是可接受的。图不正确的重构环境信息可视化 第七讲三维标量场等值面可视化 表面重构过程分成两步:拓扑重构拓扑重构 推导实体的拓扑表示 几何重构几何重构 建立实体的几何表示环境信息可视化 第七讲三维标量场等值面可视化 拓扑重构拓扑重构 拓扑重构的目的是对三维断层数据集中的每一断层上的轮廓线进行分类轮廓线进行分类,确定各轮廓线所属的实体,保证几何重构的正确性,因而拓扑重构是断层数据重构的基础,当断层上有多个轮廓线时,意味着会出现实体交叉,问题就更复杂了,更有必要首先进行拓扑重构。6.1.1 分类图嵌套树 轮廓线的分类由分类图描述。分类图的每一顶点对应于一条轮廓线,其边连接的是属于相邻层的两条轮廓线如果存在一个由该分类图描述的实体,则认为该分类图是有效的。也就是讲,一有效的分类图对应于一满足条件的实体。对于若干层上的一组轮廓线,通常存在多个分类图,图表示了一组轮廓线和不同的分类图,当然并不是所有分类图都是有效的,在图中(b)是无效的,因为在层之间其对象的边界发生相交,这意味着在对象边界点上存在非二维点环境信息可视化 第七讲三维标量场等值面可视化 6.1.2 6.1.2 分类图的枚举分类图的枚举 如前所述,对于不同层上的一组轮廓线,存在多个分类图,因此拓扑重构问题的解并非唯一,每一有效的分类图都是一个解,都对应于一个实体本节介绍一个有效拓扑分类图的枚举算法,该算法基于相邻断层嵌套树的比较结果,分析一连续扫描实体各断层上轮廓线数目的变化情况,根据断层实体的基本分叉,枚举出所有可能的有效分类图根据约束性,从中选择出正确的分类图 枚举算法仅考虑具有基本连接的分类图在分类图中,所谓连接是指两相邻断层间分类图中的一个子图的连通成分,如果该连通成分是单点、单边或度数为2的连接,就被称为基本连接度数为2是指一个结点以两条边与相邻断层上两个结点相连引入基本连接是为了简化讨论,对应四种基本连接,有四类基本的对象实体:极值点、圆柱、独立分叉相连通分叉,如图55所示这种分类方法被广泛地使用在表面重建中环境信息可视化 第七讲三维标量场等值面可视化 图6.7 四种基本分叉情况a)极值点;(b)圆柱;(c)独立分叉;(d)连通分叉环境信息可视化 第七讲三维标量场等值面可视化 图四种基本连接表面插值方式6.2 三角片表面几何重构三角片表面几何重构几何重构的任务是在拓扑重构分类图的基础上建立对象的几何表面,要求该对象与给定的分类图对应,其断层与各给定断层轮廓线一致对象的实体表面可以看成是由相邻断层间插值表面段组合而成,根据前节推导的基本连接分类图,相应地有四种基本连接的表面插值方式,见图。具体表面段还要满足一些其它的边界条件,如不自交,各断面间不相交等等。环境信息可视化 第七讲三维标量场等值面可视化 图6.14 基本三角片构造对象表面图6.15 有向图G6.2.1 圆柱体三角片表面圆柱体三角片表面环境信息可视化 第七讲三维标量场等值面可视化 6.3 连续表面重构连续表面重构图6.25 轮廓面表示环境信息可视化 第七讲三维标量场等值面可视化 图6.27 多边形链的内部和外部 6.4 面向体的重构面向体的重构环境信息可视化 第七讲三维标量场等值面可视化 本节课内容第七讲第七讲 三维标量场等值面可视化三维标量场等值面可视化7.1 Cuberille表示和显示方法7.2 Marching Cube算法7.3 有限元等值面7.4 VTK中三维标量场的等值面可视化环境信息可视化 第七讲三维标量场等值面可视化 等值面是指空间中的一张曲面,在该曲面上函数F(x,y,z)的值等于某一给定值准确地讲,是在一网格空间中,其中每一结点保存着连续三变量函数F(x,y,z)在网格单元(xi,yj,zk)上的采样值F(xi,yj,zk),对于某一给定值Ft,等值面是由所有点SFt(x,y,z):F(x,y,z)Ft 组成的一张曲面。环境信息可视化 第七讲三维标量场等值面可视化 等值面技术在可视化中应用很广,许多标量场中的可视化问题都归纳为等值面的抽取和绘制,如:医学图像中的三维重建;有限元计算中的标量场分析,包括等势面、等位面、等压面等等;分子化学中的分子表面显示;地质中矿藏分布的构造等等值面的抽取和显示是可视化的一个重要方面。环境信息可视化 第七讲三维标量场等值面可视化 第六讲介绍的断层间表面重构也可以看成是一种等值面的构造技术,它是基于各断层上提取的二维轮廓线(等值线)构造断层间的实体表面段,由所有这些各断层间的实体表面段组成对象的轮廓面(等值面)这种方法较适合于断层扫描数据且断层间等值面变化较小或大致相似,同时精度要求较低的场合,对于变化较大的标量场或标量场是由逐个非正规化单元组成的情况,特别是有限元单元,这种等值面的构造方法显然是不适应的。因此,出现了以Marching Cube算法为代表的单元内的等值面直接提取方法,本讲着重介绍这方面的内容。环境信息可视化 第七讲三维标量场等值面可视化 等值面生成的最早研究还是从医学图像的应用中开始的,由于医学图像数据是三维正交的等距网格,其网格单元可看成是正六面体单元(至少在参数空间),整个数据场就是由这种正六面体组成的,这种组成三维图像的基本正六面体单元称为体素(voxel)最早的体素被认为是由一个网格点及其附近区域组成的一个等值空间,也就是Cuberille表示,其中的等值面就由该体素的六个外表面中的一个或几个组成这样生成的等值面虽计算简单,但效果不佳 Marching Cube算法的提出提供了一种精确地定义体素及其体素内等值面的生成方法,体素被定义为由相邻层之间八个网格点组成的数据单元它提供了一种更一般化的体素定义,即将等值面生成技术推广到了有限元数据的分析上环境信息可视化 第七讲三维标量场等值面可视化 7.1 Cuberille表示和显示方法Cuberille表示是一种适合于正交密集数据场的表示方法,主要适用在医学图像、无损探伤等三维图像的等值面抽取该表示将三维图像中的每一象素看成是空间中的一个小立方体,在该小立方体内,数据场具有相同的值,整个空间及其对象就由这类小立方体组成这类小立方体被称作Cuberille表示中的体素。Cuberille表示和显示方法就是基于这种简单的体素表示。环境信息可视化 第七讲三维标量场等值面可视化 图7.1 Cuberille中的体素环境信息可视化 第七讲三维标量场等值面可视化 7.2 Marching Cube算法 Marching Cube算法是三维数据场等值面生成的经典算法,是体素单元内等值面抽取技术的代表。这一类算法所处理的数据一般是三维正交的数据场。Marching CubeMarching Cube算法中的立方体体素算法中的立方体体素与与CuberilleCuberille表示中的立方体体素不表示中的立方体体素不同,后者仅以一个等值立方体表示同,后者仅以一个等值立方体表示一个体素值,等值面由体素的六个一个体素值,等值面由体素的六个表面面元组成而在表面面元组成而在Marching CubeMarching Cube算法中,体素是一逻辑上的立方体,算法中,体素是一逻辑上的立方体,由相邻层上的各四个象素组成立方由相邻层上的各四个象素组成立方体上的八个顶点,如图所示算法体上的八个顶点,如图所示算法以扫描线方式逐个处理数据场中每以扫描线方式逐个处理数据场中每一立方体体素,求出每一体素内包一立方体体素,求出每一体素内包含的等值面,由此生成整个数据场含的等值面,由此生成整个数据场的等值面的等值面图7.2 Marching Cube中的体素环境信息可视化 第七讲三维标量场等值面可视化 7.2.1 基本算法 Marching Cube算法的基本思想是逐个处理数据场中的立方体,分类出与等值面相交的立方体,采用插值计算出等值值面与立方体边的交点 根据立方体每一顶点与等值面的相对位置,将等值面与立方体边的交点按一定方式连接生成等值面,作为等值面在该立方体内的一个逼近表示 因而,Marching Cube算法中每一单元内等值面抽取的主要计算是:体素中由三角片逼近的等值面计算体素中由三角片逼近的等值面计算;环境信息可视化 第七讲三维标量场等值面可视化 体素中等值面的计算体素中等值面的计算 Marching Cube算法的基本假设是沿着立方体的边数据场呈连续线性变化,也就是讲,如一条边的两个顶点分别大于小于等值面的值,则在该条边上必有也仅有一点是这条边与等值面的交点确定立方体体素中等值面的分布是该算法的基础 首先对立方体的八个顶点进行分类,以判定其顶点是位于等值面之外,还是位于等值面之内再根据八个顶点的状态,确定等值面的模式 顶点分类规则为 1)如立方体顶点的数据值等值面的值,则定义该顶点位于等值面之外,记为“+”;2)如立方体顶点的数据值等值面的值,则定义该顶点位于等值面之内,记为“-”;环境信息可视化 第七讲三维标量场等值面可视化 由于每一体素共有8个顶点,每个顶点共有2个状态,因此共有256种组合状态分析立方体体素的两种对称性:1)如顶点状态返转,等值三角面片的拓扑结构不变也就是讲,大于等值面点与小于等值面的点是可以相互替换的;2)旋转对称性,经过适当旋转,有许多状态是一致的,如图所示环境信息可视化 第七讲三维标量场等值面可视化 图7.3 旋转对称性环境信息可视化 第七讲三维标量场等值面可视化 这样,共总结出15种模式(见图7.4a,b):图7.4a 体素中的等值面模式01234567环境信息可视化 第七讲三维标量场等值面可视化 图7.4b 体素中的等值面模式891014131211环境信息可视化 第七讲三维标量场等值面可视化 在实现时,可按照立方体顶点状态构造等值面连接模式的索引表:可直接由立方体各顶点的状态检索出其中等值面的分布模式确定该立方体体素内的等值面三角片连接方式。环境信息可视化 第七讲三维标量场等值面可视化 三角片顶点计算三角片顶点计算 在确定立方体内三角片等值面分布模式后,就要计算出三角片顶点位置,根据算法的基本假设,可以直接用线性插值计算等值面与立方体边的交点X:该算法在执行时,每次扫描其中两片断层图像,构造这两层之间的立方体体素首先对立方体顶点进行分类由分类顶点建立该立方体在检索分类表中的索引下标,检索分类表中对应的等值面分布模式由线性插值计算出三角片顶点位置,将立方体边上的交点按等值面片连接模式连接成三角片或多边形。环境信息可视化 第七讲三维标量场等值面可视化 二义性解决方法 Marching Cube算法提供了一种较精确的等值面生成方法,但在它所提出的15种体素内等值面连接模式中存在着许多二义性的连接,如图所示图二义性立方体环境信息可视化 第七讲三维标量场等值面可视化 在立方体的一个面上,如果位于等值面内和在等值面外的顶点分别分布在对角线的两端,那么就有两种可能的连接方式,因而存在二义性,这样的面称之为二义性面包含一个以上二义性面的立方体,即为二义性立方体 在上述模式中,3,6,7,l0,12,13共六种模式是二义性立方体要能正确地构造等值面,必须解决二义性立方体内的等值面连接模式,否则在等值面连接上会出现空洞等问题如在3,6两种连接上,有两种可能的连接模式(见图7.6)。解决的方法主要有两类:采用双曲线渐近线交点来判定二义性面和采用四面体剖分。环境信息可视化 第七讲三维标量场等值面可视化 图7.6 二义性等值面环境信息可视化 第七讲三维标量场等值面可视化 图7.7 三维线性插值环境信息可视化 第七讲三维标量场等值面可视化 图7.8 等值面与立方体交线的四种情况环境信息可视化 第七讲三维标量场等值面可视化 图7.9 二义性等值面的判定环境信息可视化 第七讲三维标量场等值面可视化 在Marching Cube基本算法的15种模式中,0,1,2,4,5,8,9,11,14不存在二义性表面,因而只有一种连接方式。3,6各存在一个二义性面,各有两种可能的连接方式10,12各存在两个二义性面,也就是各有四种可能的连接方式,7存在三个二义性面,有8种可能的连接方式,l3存在6个二义性面,有64种连接方式,组合相加共有93种可能的连接方式,除去对称的和相同的方式,共有34种不同的连接,图列出了其中的主要情况。环境信息可视化 第七讲三维标量场等值面可视化 无二义面模式,只有一种连接方式01245891411环境信息可视化 第七讲三维标量场等值面可视化 各一个二义性面,有两种可能的连接方式36环境信息可视化 第七讲三维标量场等值面可视化 1012各存在两个二义性面,也就是各有四种可能的连接方式环境信息可视化 第七讲三维标量场等值面可视化 7存在三个二义性面,有8种可能的连接方式环境信息可视化 第七讲三维标量场等值面可视化 13存在6个二义性面,有64种连接方式环境信息可视化 第七讲三维标量场等值面可视化 7.10 二义性立方体的具体连接方式环境信息可视化 第七讲三维标量场等值面可视化 另一种消除二义性的方法是将立方体剖分成四面体处理,在四面体中生成等值面就不存在二义性问题。可假设在四面体边上数据场呈线性变化,对于每个四面体,等值面模式只有三种情况,如图所示如果顶点数据值全大于或小于等值面值,等值面与单元无交,如一点大于另三点小于等值面值,则四面体中等值面是一三角片,如二点大于二点小于等值面值,则等值面是一四边形,可由两个三角片构造图7.11 四面体中的等值面环境信息可视化 第七讲三维标量场等值面可视化 7.3 有限元中的等值面 在有限元分析的后置处理中,等值面抽取和显示是一个主要手段,与前述的立方体体素相比较,尽管基本思路相同,但由于有限元数据的特点,有限元中的等值面生成又有其不同之处与正规化体素相比,有限元数据有以下特点:1)单元类型不一样,常见的有限元单元类型有4结点、6结点、8结点等,且每一单元比体素要大得多,单元边也往往非直线(见图7.12);2)输入数据不一样,其几何连通性不是隐含的,而是显式说明的,数据中包含了每一单元每一顶点的几何数据图常见的有限元单元类型 环境信息可视化 第七讲三维标量场等值面可视化 小结 等值面是三维标量场最基本的表示方法。Cuberille表示将整个场空间划分成等值立方体体素,其中等值面由体素的外表面组成。为了提高等值面生成的精度,体素被认为是由相邻层对应八个采样点组成。针对这种体素表示,出现了以Marching Cube算法为代表的单元内的等值面抽取方法。两种二义性解决方法:基于线性插值假设下的渐近线交点判定方法和四面体剖分后插值及等值面构造。环境信息可视化 第七讲三维标量场等值面可视化 7.4 VTK中三维标量场的等值面可视化中三维标量场的等值面可视化以规则三维网格数据为例,VTK中的实现方法如下:(1)获取三维标量场数据reader=vtkRectilinearGridReader()reader.SetFileName(VTK_DATA+/)(2)生成等值面过滤器对象iso=vtkContourFilter()(3)设置等值面值()iso.SetValue(0,0.2)iso.SetValue(1,1.9)iso.SetValue(2,1.0)iso.SetValue(3,0.5)(4)重新计算法向量normals=vtkPolyDataNormals()()normals.SetFeatureAngle(45)(5)设置Mapper和ActorisoMapper=vtkPolyDataMapper()()isoActor=vtkActor()isoActor.SetMapper(isoMapper)环境信息可视化 第七讲三维标量场等值面可视化 from vtk import*reader=vtkRectilinearGridReader()()读入数据iso=vtkContourFilter()()iso.SetValue(0,0.2)iso.SetValue(1,1.9)iso.SetValue(2,1.0)iso.SetValue(3,0.5)构造等值面normals=vtkPolyDataNormals()()normals.SetFeatureAngle(45)重新计算法向isoMapper=vtkPolyDataMapper()()isoActor=vtkActor()isoActor.SetMapper(isoMapper)ren=vtkRenderer()renWin=vtkRenderWindow()renWin.AddRenderer(ren)iren=vtkRenderWindowInteractor()iren.SetRenderWindow(renWin)ren.AddActor(isoActor)ren.SetBackground(1,1,1)renWin.SetSize(400,400)()()运行运行环境信息可视化 第七讲三维标量场等值面可视化 VTK提供的其它等值面类:vtkKitwareContourFilter vtkSynchronizedTemplates3DvtkMarchingContourFiltervtkMarchingCubes环境信息可视化 第七讲三维标量场等值面可视化 为等值面设置颜色:iso=vtkMarchingContourFilter()iso.SetInput(dataGrid)iso.SetValue(0,0.5)iso.SetValue(1,1.0)iso.SetValue(2,1.5)iso.SetValue(3,2.0)normals=vtkPolyDataNormals()()normals.SetFeatureAngle(45)Iut1=vtkLookupTable()调色板Iut1.SetTableRange(0.5,2.0)Iut1.SetNumberOfTableValues(4)Iut1.SetTableValue(0,0.0,0.0,1.0,1.0)Iut1.SetTableValue(1,0.0,1.0,1.0,1.0)Iut1.SetTableValue(2,1.0,1.0,0.0,1.0)Iut1.SetTableValue(3,0.0,1.0,0.0,1.0)isoMapper=vtkPolyDataMapper()()isoMapper.SetScalarRange(0.5,2.0)isoMapper.SetLookupTable(Iut1)isoActor=vtkActor()isoActor.SetMapper(isoMapper)运行运行环境信息可视化 第七讲三维标量场等值面可视化 VTKVTK中提供的切面类:中提供的切面类:vtkCuttervtkCutterreader=vtkRectilinearGridReader()reader=vtkRectilinearGridReader()读入数据读入数据)reader.Update()reader.Update()cutPlane=vtkPlane()cutPlane=vtkPlane()构造面对象构造面对象cutPlane.SetOrigin(reader.GetOutput().GetCenter()cutPlane.SetOrigin(reader.GetOutput().GetCenter()面的原点面的原点cutPlane.SetNormal(1,0,0)cutPlane.SetNormal(1,0,0)面的法向面的法向planeCut=vtkCutter()planeCut=vtkCutter()切面对象切面对象()()待切割的数据待切割的数据planeCut.SetCutFunction(cutPlane)planeCut.SetCutFunction(cutPlane)把面和切面对象关联把面和切面对象关联 cutMapper=vtkDataSetMapper()cutMapper=vtkDataSetMapper()()()scalars=reader.GetOutput().GetPointData().GetScalars()scalars=reader.GetOutput().GetPointData().GetScalars()()()cutActor=vtkActor()cutActor=vtkActor()cutActor.SetMapper(cutMapper)cutActor.SetMapper(cutMapper)运行运行环境信息可视化 第七讲三维标量场等值面可视化 下一节课内容:第八讲第八讲 三维标量场体可视化三维标量场体可视化 体绘制与面绘制的比较 体光照模型 体光线跟踪法 体单元投影法 三维扫描变换 混合绘制算法 有限元数据场的体绘制
展开阅读全文