学习笔记13

.vtkCamera

VTK相机类vtkCamera原理及用法_小政哥的私房博客-CSDN博客

.vtkLight

1.当我们设置舞台上的光照参数时,要用到照相机Camera信息以及属性Property信息。因此头文件中不仅仅要包括#include还必须包括#include和#include

2.我们设计的是灯光位置,通过一组实验我们知道相机、光源、对象所在的世界坐标      系是右手坐标系•Light->SetPosition()将光源放置在(WC)指定位置•Light->SetFocalPoint(renderer->GetActiveCamera()->GetFocalPoint())将光源焦点设置为相机的焦点

学习笔记13_第1张图片

.医学图像三维可视化重建

学习笔记13_第2张图片

●图像显示方式主要可以分为三类:

(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)——三维重建的后处理【重建后再切片】将扫描范围内所有的轴位图像叠加起来【即,三维重建】,再对某些标线标定的重组线所指定的组织进行冠状、矢状位、任意角度斜位图像重组。

学习笔记13_第3张图片

学习笔记13_第4张图片
学习笔记13_第5张图片

1.计算法向量

学习笔记13_第6张图片

顶点的法向量

学习笔记13_第7张图片
学习笔记13_第8张图片
学习笔记13_第9张图片

3.2 VTK修炼之道53:图形基本操作进阶_多分辨率策略(模型细化的三种方法)_沈春旭的博客-CSDN博客

※关于InputData:都只处理三角面片单元。若输入的面片为多边形面片,可以使用vtkTriangleFliter

转换为三角面片处理参数:

SetNumberOfSubdivisions设置戏细分的次数n,由于每次细分1->4,最终会产生4*n个三角面片(与Decimation相反,一个使三角面片更少,一个使其更多)

•vtkLinearSubdivisionFilter 线性细分算法,每次细分将每个三角形面片生成4个新的面片,该算法比较简单,速度快,但是细分后不能产生光滑的模型。

•vtkLoopSubdivisionFilter Loop细分算法,每次细分会将一个三角面片生成4个三角面片;该方法可以生成光滑的连续曲面,应用比较广泛。

•vtkButterflySubdivisionFilter 蝶形细分算法

结论:如果有必要,可以采取Loop算法进行细分,提高光滑度

学习笔记13_第10张图片

4. 网格平滑

•一种调整数据集中点坐标的技术。

•在平滑过程中,不会改变数据集的拓扑结构,只改变几何结构。

•网格平滑的应用包括提高等值面的外观,或者作为移除表面噪声的模型工具。通过应用网格平滑,模型的外观能够动态地提高。

结论:采取vtkWindowedSincPolyDataFilter进行平滑,提高光滑度

vtkSmoothPolyDataFilter采用Laplacian(拉普拉斯平滑)平滑,核心思想是用邻域节点的中心[平均值]代替原始点

学习笔记13_第11张图片

Smallrelaxationfactorsandlargenumbersofiterationsaremorestablethanlargerrelaxationfactorsandsmallernumbersofiterations

•NumberOfIterations:Laplacian smoothing的迭代次数 【↑】

•RelaxationFactor:Laplacian smoothing的松弛因子 【↑】

•BoundarySmoothing控制是否对边界点平滑。

边界点的概念:在一个网格模型中,一条边只被一个单元包含那么这条边就是边界边,而边界边上的点则为边界点。如果一个模型中含有边界边,则说明该模型不是封闭的。

•FeatureEdgeSmoothing控制是否对特征边上的点的平滑(如果一条边被两个邻近的多边形公用,若这两个多边形法向量的夹角(特征角)大于定义的阈值,则说明这边为一条特征边)

学习笔记13_第12张图片

特征角越大,说明改边越尖锐。特征边/角往往表达模型的细节,平滑过程中最好不要进行处理,以保护细节不受损伤。

虽然通过特征边平滑设置可以降低一部分细节损失,但并不能完全避免,且随着laplace平滑的不断迭代,模型会逐渐向网格的中心收缩。所以,vtkWindowSincPolyDataFilter是一种更好的选择,该算法采用窗口Sinc函数实现网格平滑,能够最小程度地避免收缩,vtkWindowSincPolyDataFilter的用法和VTKSmoothPolyDataFilter用法完全一致。

相比之下,vtkWindowedSincPolyDataFilter需要的迭代次数更少一些;而且可以避免vtkSmoothPolyDataFilter出现随着平滑量增大而向中心收缩的问题不要启用BoundarySmoothing

NonManifoldSmoothingFeatureEdgeSmoothing!!!!开销巨大而且效果很不好

•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函数用来控制需要修补洞的最大范围,大于该值则不需要修补该洞。

•为什么需要在填充之后重新计算法向量,调整方向一致性?

法向量这个东西和光照与阴影的计算密切相关。单元的法向量朝向则与单元的点顺序相关!只有保持所有的单元的点顺序一致才能得到正确的法向量,否则在网格模型显示时会得到意外的结果!如下:

学习笔记13_第13张图片

由于经过fill holes,模型的所有单元的点顺序并不一致,因此使用vtkPolyDataNormals::ConsisitencyOn()进行调整。这样才能避

免上面的问题。

学习笔记13_第14张图片

六.一些取等值面的类

学习笔记13_第15张图片

•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、引用数据类型的特点:存储的是该对象在栈中引用,真实的数据存放在堆内存里

引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。

学习笔记13_第16张图片

深拷贝和浅拷贝是只针对Object和Array这样的引用数据类型的。(因为存在共不共享内存的情况)

深拷贝和浅拷贝的示意图大致如下:

学习笔记13_第17张图片

浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象

你可能感兴趣的:(3D交互分割软件,3d渲染,vtk)