一.vtkCamera
VTK相机类vtkCamera原理及用法_小政哥的私房博客-CSDN博客
二.vtkLight
1.当我们设置舞台上的光照参数时,要用到照相机Camera信息以及属性Property信息。因此头文件中不仅仅要包括#include
2.我们设计的是灯光位置,通过一组实验我们知道相机、光源、对象所在的世界坐标 系是右手坐标系•Light->SetPosition()将光源放置在(WC)指定位置•Light->SetFocalPoint(renderer->GetActiveCamera()->GetFocalPoint())将光源焦点设置为相机的焦点
三.医学图像三维可视化重建
●图像显示方式主要可以分为三类:
(1) 反射式显示
从体数据的感兴趣区提取被观察物体的表面,施以一定的光照模型,选择某一视角从物体外部观察物体表面形态的显示方式。典型的如表面绘制技术[面绘制](Surface Rendering)。
VTK中基于面绘制实现三维重建,使用的是经典的Marching Cubes(移动立方体法)算法。
面绘制是采用分割技术对一系列的二维图像进行轮廓识别、提取等操作,最终还原出被检测物体的三维模型,并以表面的方式显示出来。
面绘制的数据流管道pipeline结构为:
读取器->提取等值面->数据处理->映射器->实例化角色->绘制器->绘制窗口->交互器->交换方式。
VTK提供了两种提取等值面的类:
(1) vtkContourFilter
(2) vtkMarchingCubes.
VTK通过vtkPolyDataNormals在等值面上产生法向量;通过vtkStripper在等值面上产生纹理或三角面片。
来自 <基于VTK实现面绘制(SR)和体绘制(VR)的基本代码_inter_peng的专栏-CSDN博客_面绘制> 代码和结果显示
VTK实现面绘制
VTK 面绘制_露露_新浪博客
(2) 透射式显示
类似于X射线成像原理,将反映医学图象特性的图象强度看作对光线不同吸收的特性,光线穿透物体的最大吸收或累加吸收效果构成物体的结构图象。典型的技术有体绘制技术(Volume Rendering)。
体数据和面数据的本质区别,在于是否包含了体细节,而不是在维度方面,他们都是三维
数据
面绘制需要生成中间图元,而体绘制则是直接在原图上进行绘制,内容需求较面绘制小。
每切换一个视角需要重新对所有的像素点进行颜色和透明度计算,需要时间比面绘制长。
VTK的管道结构实现体绘制需要的类有:
vtkRenderWindow, vtkRenderer, vtkLight, vtkCamera, vtkActor, vtkProperty, vtkTransform.
dataset->filter->mapper.
VTK实现体绘制
vtk 体绘制_露露_新浪博客
(3) 断层(剖面)显示
不经3D重建,直接显示过空间某一点的三个正交剖面的形态结构。
【多平面重建】——MPR(Mult-planner reformation)——三维重建的后处理【重建后再切片】将扫描范围内所有的轴位图像叠加起来【即,三维重建】,再对某些标线标定的重组线所指定的组织进行冠状、矢状位、任意角度斜位图像重组。
1.计算法向量
顶点的法向量 |
|||
3.2
※关于InputData:都只处理三角面片单元。若输入的面片为多边形面片,可以使用vtkTriangleFliter
转换为三角面片处理参数:
SetNumberOfSubdivisions设置戏细分的次数n,由于每次细分1->4,最终会产生4*n个三角面片(与Decimation相反,一个使三角面片更少,一个使其更多)
•vtkLinearSubdivisionFilter 线性细分算法,每次细分将每个三角形面片生成4个新的面片,该算法比较简单,速度快,但是细分后不能产生光滑的模型。
•vtkLoopSubdivisionFilter Loop细分算法,每次细分会将一个三角面片生成4个三角面片;该方法可以生成光滑的连续曲面,应用比较广泛。
•vtkButterflySubdivisionFilter 蝶形细分算法
结论:如果有必要,可以采取Loop算法进行细分,提高光滑度
4. 网格平滑
•一种调整数据集中点坐标的技术。
•在平滑过程中,不会改变数据集的拓扑结构,只改变几何结构。
•网格平滑的应用包括提高等值面的外观,或者作为移除表面噪声的模型工具。通过应用网格平滑,模型的外观能够动态地提高。
结论:采取vtkWindowedSincPolyDataFilter进行平滑,提高光滑度
vtkSmoothPolyDataFilter采用Laplacian(拉普拉斯平滑)平滑,核心思想是用邻域节点的中心[平均值]代替原始点
Smallrelaxationfactorsandlargenumbersofiterationsaremorestablethanlargerrelaxationfactorsandsmallernumbersofiterations
•NumberOfIterations:Laplacian smoothing的迭代次数 【↑】
•RelaxationFactor:Laplacian smoothing的松弛因子 【↑】
•BoundarySmoothing控制是否对边界点平滑。
边界点的概念:在一个网格模型中,一条边只被一个单元包含那么这条边就是边界边,而边界边上的点则为边界点。如果一个模型中含有边界边,则说明该模型不是封闭的。
•FeatureEdgeSmoothing控制是否对特征边上的点的平滑(如果一条边被两个邻近的多边形公用,若这两个多边形法向量的夹角(特征角)大于定义的阈值,则说明这边为一条特征边)
特征角越大,说明改边越尖锐。特征边/角往往表达模型的细节,平滑过程中最好不要进行处理,以保护细节不受损伤。
虽然通过特征边平滑设置可以降低一部分细节损失,但并不能完全避免,且随着laplace平滑的不断迭代,模型会逐渐向网格的中心收缩。所以,vtkWindowSincPolyDataFilter是一种更好的选择,该算法采用窗口Sinc函数实现网格平滑,能够最小程度地避免收缩,vtkWindowSincPolyDataFilter的用法和VTKSmoothPolyDataFilter用法完全一致。
相比之下,vtkWindowedSincPolyDataFilter需要的迭代次数更少一些;而且可以避免vtkSmoothPolyDataFilter出现随着平滑量增大而向中心收缩的问题不要启用BoundarySmoothing,
NonManifoldSmoothing或FeatureEdgeSmoothing!!!!开销巨大而且效果很不好
•vtkWindowedSincPolyDataFilter
adjust point positions using a windowed sinc functioninterpolation kernel参数:•NumberOfIterations:Specify the number of iterations (拟合windowed sinc 函数的多项式次数[degree of the polynomial]).【↑】
•PassBand:Setthepassbandvalueforthewindowedsincfilter(位于0-2之间的倍增点) 【↓】
Lower PassBand values produce more smoothing. A good default value for the PassBand is 0.1
5. Fill Holes填充孔洞
【特征边与封闭性检测】
是否存在边界边是检测一个网格模型是否封闭的重要特征。
•vtkFeatureEdges是一个非常重要的类,该类能够提取多边形网格模型中四种类型的边。
边界边:只被一个多边形或者一条边包围的边。
非流形边:被三个或者三个以上多边形包围的边;
特征边:需要设置一个特征角的阈值,当包含同一条边的两个三角形的法向量的夹角大于该
阈值时,即为一个特征边。
流行边:只被两个多边形包含的边。
【填充】
•vtkFillHolesFilter :Identify and fill holes in meshes
原理:首先检测出网格中的所有边界边,然后找出这些边界边中的每个闭合回路[孔洞],最后利用vtkPolygon::NonDegenerateTriangulate将每个孔洞进行三角化(即生成三角网格)。
需要注意的是,有些边界的孔洞是不需要三角化的,例如一个平面网格,若填补其四周的边界边,则会与原网格产生覆盖。
使用SetHoleSize函数用来控制需要修补洞的最大范围,大于该值则不需要修补该洞。
•为什么需要在填充之后重新计算法向量,调整方向一致性?
法向量这个东西和光照与阴影的计算密切相关。单元的法向量朝向则与单元的点顺序相关!只有保持所有的单元的点顺序一致才能得到正确的法向量,否则在网格模型显示时会得到意外的结果!如下:
由于经过fill holes,模型的所有单元的点顺序并不一致,因此使用vtkPolyDataNormals::ConsisitencyOn()进行调整。这样才能避
免上面的问题。
六.一些取等值面的类
•vtkContourFilter:一个【通用】的等值面提取类,其可以接受【any 类型数据】生成等值线或等值面。
•vtkMarchingContourFilter:接受【any 类型数据】,其内部根据数据不同生成不同的算法对象实现等值面/线的提取,具有较高的效率
•vtkMarchingCubes:主要针对【规则体数据volume】生成等值面vtkDiscreteMarchingCubes:继承自vtkMarchingCubes,主要针对【Labeled volume 体数据】,比如利用图像【分割】算法对医学图像进行分割后得到含有不同Label值得数据,每个Label对应一个组织,如果想要得到其中一个或者几个组织的轮廓模型,则可以考虑使用该类。
•vtkImageMarchingCubes:主要处理【三维图像数据】
•vtkMarchingSquares:则是针对【二维规则网格数据】生成等值线 针对image (i.e., a volume slice)
七.深拷贝和浅拷贝
数据分为基本数据类型(String, Number, Boolean, Null, Undefined,Symbol)和对象数据类型。
1、基本数据类型的特点:直接存储在栈(stack)中的数据
2、引用数据类型的特点:存储的是该对象在栈中引用,真实的数据存放在堆内存里
引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。
深拷贝和浅拷贝是只针对Object和Array这样的引用数据类型的。(因为存在共不共享内存的情况)
深拷贝和浅拷贝的示意图大致如下:
浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。