1.vtkVolumeMapper

vtkVolumeMapper是所有体绘制Mapper类的虚基类,提供接口函数,并由其子类实现具体功能。该类的继承关系如下图所示:
应该掌握一些常用的体绘制类。

2.光线投射:vtkVolumeRayCastMapper

光线投射法是最常用的体绘制方法。它是一种基于图像序列的直接体绘制方法。
光线投影法的基本原理是从投影图像平面(通常为平面)的每个像素沿着视线方向发射一条穿过体数据的射线,然后在射线上按照一定的步长进行等距采样,对每个采样点采用插值技术来计算其体素值,根据颜色传输函数和不透明度传输函数来获取相应的颜色值和不透明度,最后利用光线吸收模型将颜色值进行累加直至管线穿过体数据。这样,就可以得到当前平面像素的渲染颜色,最终生成显示图像。
光线投影法的优点是能够比较精确地模拟原始体数据,但计算量较大,实时体绘制对计算机硬件的要求比较高
在VTK中,VTKVolumeRayCastMapper类可用于实现光线投影体算法,并生成渲染图元数据传递给vtkVolume对象进行渲染。
vtkVolumeRayCastMapper采用软件方法来实现光线投影算法,精度高但是计算量比较大,因此渲染速度相对比较慢。
该类内部实现了两个非常重要的函数:
  • vtkVolumeRayCastMapper::SetInput(vtkImageData*):该函数用于设置输入图像数据;
  • vtkVolumeRayCastMapper::SetVolumeRayCastFunction(vtkVolumeRayCastFunction*):该类用于设置光线投射函数。
vtkVolumeRayCastMapper中计算每条光线在通过体数据后的颜色是通过定义的vtkVolumeRayCastFunction对象来实现的。因此,必须为vtkVolumeRayCastMapper指定一个vtkVolumeRayCastFunction象,  vtkVolumeRayCastFunction是一个虚基类,他包含三个子类。

2.1 vtkVolumeRauCastCompositeFunction

该方式通过Alpha合成技术生成每个像素的颜色值。对于每条光线在穿过体数据时,先根据设置的采样步长进行采样,通过插值技术来计算每个采样点的像素值;然后根据vtkVolumeProperty中设置颜色传输函数和不透明度传输函数来计算采样点的颜色和不透明度。最后,对所有采样点采用Alpha合成方法计算最终的颜色。
另外,该方式还可以设置插值优先还是分类优先。插值优先是指对投射光线进行采样,计算采样点的颜色值时,先通过插值方式计算该采样点的标量值(灰度值),然后再根据颜色传输函数和不透明度传输函数计算该点的颜色值和不透明度分类优先是指在计算采样点时,先根据颜色传输函数和不透明度传输函数计算包含该采样点的立方体的8个顶点颜色值和不透明度,然后通过插值方法获取当前采样点的颜色值与不透明度。选择插值优先还是分类优先要通过一下两个函数:
  • SetCompositeMethodToInterpolateFirst()
  • SetCompositeMethodToClassifyFirst()
从显示效果上来说,插值优先具有较好的显示效果,但在一些情况下也会存在问题。例如,CT图像中,低于20的值属于空气,20~80的部分是软组织,大于80部分是骨骼。如果先进行插值,那么空气与谷歌之间永远不会相邻,因为他们之间一定存在软组织。但是,我们的牙齿是和空气直接接触的,当使用插值优先策略并使用比较高的采样率进行体绘制时,渲染结果会使牙齿看起来像是覆盖了一层皮肤。

2.2 vtkVolumeRayCastMIPFunction

最大密度投影函数主要用于对体数据中高灰度值得结构进行可视化。当光线穿过体数据时,在光线上进行等距采样。取采样点中属性最大值为该条光线的输出。光线对应的屏幕像素颜色值就可以通过该值进行颜色映射获得。默认情况下,这个属性是指体数据的像素值或者体数据的不透明度,其设置函数为:
  • SetMaximizeMethodToScalarValue()
  • SetMaximizedMethodToOpacity()
当采用标量(灰度)属性时,先经过体数据的光线进行等距离采样,然后通过插值计算每个采样点的标量值,最后取标量值为最大的采样点对应的颜色和不透明度作为输出;当采样不透明度作为输出时,投射光线上每次采样都要计算一次不透明度,最后取不透明度最大值的采样点的颜色和不透明度作为输出。
通常,最大强度投影算法不计算明暗信息和深度信息,成像类似于X光,该方法常用于显示血管的三维结构。该类的使用方法也是非常简单的,和vtkVolumeRayCastCompositeFunction一致:
vtkSmartPoint<vtkVolumeRayCastMIPFunction> rayCastFun =
vtkSmartPointer<vtkVolumeRayCastMIPFunction>::New();

2.3 vtkVolumeRayCastIsosurfaceFunction

对等值面绘制函数能够渲染体数据中特定等值面,其中,SetIsoValue(double)函数用于设置等值面的值。在进行体绘制,所有小于该值的像素不透明度都设置为0.通过设定等值面的值,可以重建出某一特定的组织,如皮肤、骨骼等,渲染结果类似与面绘制。同样地,使用该函数进行体绘制时,代码如下:

vtkSmartPointer<vtkVolumeRayCastIsosurfaceFunction> rayCastFun =
vtkSmartPointer<vtkVolumeRayCastIsosurfaceFunction>::New();
rayCastFun->SetIsoValue(100);

三种体绘制输出结果如下:

1.光线投影法输出图像:效果最好;

2.最大密度投影法输出图像:缺乏深度信息(更像X光输出);
3.等值面法体绘制输出结果:与面绘制结果类似。

3.光线投影体绘制讨论

3.1 讨论一:投影光线上的采样点的步长

光线投影体绘制中,投影光线上的采样点的步长是一个重要参数,决定了体绘制的精度和速度。步长越小,采样点就越多,但是体绘制效果提高的同时计算量也会增加。vtkVolumeRayCastMapper中设置步长的函数为:
Void SetSampleDistance(float);

这里需要注意的是,等值面绘制函数不需要进行采样,而其他另个绘制函数都需要进行采样。在实际应用中,调整采样步长主要考虑的因素有样本间距、标量数据以及标量数据映射的颜色和不同明度变化率。
vtkVolumeRayCastMapper中默认的采样步长为1;单位为世界坐标系。下面显示了步长为1和步长为4的两种情况对比:

左侧为步长等于1的情况;非常精细。
右侧为步长等于4的卿狂,比较粗糙。
实际应用过程中,如果体数据变化比较剧烈,应该适当减小采样步长以获得比较精细的渲染结果,代价就是速度的降低。

3.2 讨论二:图像采样间距(投影光线间隔)

默认情况下,图像采样间距为1,即每个像素对应一条投影光线;如果设为0.5,那么每个像素对应4条投射光线;如果设置为2,则每四个像素对应一条投影光线。设置图像采样距离的函数:
void SetImageSampleDistance(float);

需要格外注意的是,当使用这个函数的时候,必须先关闭自动调节采样距离功能,代码如下:

SetAutoAdjustSampleDistance(0); //关闭自动调整采样

默认的情况下,该函数的功能是开启的,以保证在图像旋转等交互时,能够自动调整采样距离保证实时性。如果关闭此功能,在旋转图像等交互过程中,体绘制渲染过程会变得很慢
当然,即使我们采用自动调整图像采样距离,也可以设定它的范围,控制函数为:

void SetMaximunImageSampleDistance(float);
void SetMinimumImageSampleDistance(float);

下图显示的是不同图像采样距离的渲染结果:

左图的图像采样距离为1;右图的图像采样间距为4.同样,步长越小,渲染越精细,渲染时间越长。

4.参看资料

1.《C++ primer》
2.《The VTK User’s Guide – 11thEdition》
3.  张晓东, 罗火灵. VTK图形图像开发进阶[M]. 机械工业出版社, 2015.

VTK修炼之道61:体绘制_光线投影+最大密度投影+等值面法相关推荐

  1. VTK修炼之道62:体绘制_固定点光线投影体绘制与GPU加速光线投影体绘制

    1.固定点光线投影算法 vtkFixedPointVolumeRayCastMapper是一个较好的vtkVolumeRayCastMapper的替代者.该类能够实现基于Alpha合成的体绘制方法和最 ...

  2. (医学三维重建)MATLAB体绘制算法:最大密度投影(MIP)

    (医学三维重建)MATLAB体绘制算法:最大密度投影(MIP) 算法原理 代码实现 实验结果 其他 by HPC_ZY 算法原理 体绘制原理(大多数) 用一矩形屏幕正对三维模型,从屏幕投射出M*N条平 ...

  3. VTK修炼之道70:体绘制讨论_光照阴影、VTKLODProp3D

    1.光照与阴影 通过VTKVolumeProperty可以设置体绘制阴影效果(Shading).阴影效果主要受环境光系数.散射光系数.反射光系数和高光强度四个参数影响. vtkVolumeProper ...

  4. VTK修炼之道63:纹理映射体绘制_二维纹理映射

    1.纹理映射体绘制 基于软件实现的光线投影体绘制算法计算量非常大,不利于进行实时渲染.因此,目前体绘制经常使用图形硬件利用纹理映射来加速. 其主要原理是将三维体数据作为纹理装载入硬件缓存中,利用硬件来 ...

  5. VTK修炼之道67:体绘制讨论_不透明度传输函数

    1.vtkVolume vtkVolume类似于几何渲染中的vtkActor,用于表示渲染场景中的对象.除了存储基本变换信息(平移.旋转.缩放等),其内部还存储了两个重要对象.这两个对象分别是vtkA ...

  6. VTK修炼之道60:体绘制_体绘制管线图形渲染管线

    1.几何渲染与体绘制 1.1 几何渲染 前面练习的渲染技术都是几何渲染技术.所谓的几何渲染技术,就是通过绘制几何图元(顶点.线段.面片等)来渲染数据,例如:绘制图像需要在空间中建立一个四边形图元,然后 ...

  7. VTK修炼之道69:体绘制讨论_颜色传输函数

    1.颜色传输函数 颜色传输函数与不透明度传输函数的使用类似,二者的不同之处在于颜色传输函数是将一个标量值映射为颜色值.这个颜色值可以是RGB值,也可以是HSV值. VTK颜色传输函数采用VTKColo ...

  8. VTK修炼之道64:纹理映射体绘制_三维纹理映射

    1.三维纹理映射 目前市面上的能多先科都是支持三维纹理映射的.利用三维纹理映射,将体数据映射至一组与视图平面平行的多边形,避免了二维纹理映射方法中因为纹理图像的切换造成的瑕疵.VTK中三维纹理映射体绘 ...

  9. VTK修炼之道68:体绘制讨论_梯度不透明度传输函数

    1.梯度不透明度函数 梯度不透明度函数是将梯度模值映射为一个不透明度乘子,从而增强过渡区域的显示效果. 该函数也是使用vtkPiecewiseFunction类.例如,在不同材料的临界区域,如空气到软 ...

最新文章

  1. 三分钟学会css3中的flexbox布局
  2. python numpy安装-Python--Numpy安装
  3. libevent中的hash表
  4. 再战android-语音识别2(修改配置)
  5. Scikit-learn机器学习算法库代码实践
  6. 【报告分享】2022年元宇宙全球年度(202页干货):蓄积的力量-北京大学.pdf(附下载链接)...
  7. MyBatis3源码解析(7)TypeHandler注册与获取
  8. Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘s
  9. docker 安全性问题
  10. 微信小程序支付异常:requestPayment:fail no permission
  11. python中计算DataFrame,Series的数据频率
  12. 《那些年啊,那些事——一个程序员的奋斗史》二
  13. reactjs安装并在脚手架中使用 material-ui/core
  14. java实现旅行商问题_Java中旅行商问题的强力算法
  15. 云计算演义(2)企业IT之王IBM互联网之王Google数据库之王Oracle狂奔在与关闭公有云赛跑的路上(上)
  16. Python+Docker+Redis-实现分布式爬取阳光问政
  17. 微信自定义分享ios无效
  18. 2.4 人工智能项目开发与验收
  19. 解决vimdiff ‘E97: Cannot create diffs‘错误的一种方法
  20. 正确思维,和非理性自我斗争

热门文章

  1. 屌丝程序员的返京历险记
  2. [导入]ASP.NET26个常用性能优化方法
  3. nyoj 12(区间覆盖)
  4. Ubuntu 18.04下的Python和OpenCV的安装
  5. 《机器学习实战》chapter04 使用Python进行文本分类
  6. HDUOJ-2094-产生冠军
  7. NYOJ 35 表达式求值
  8. 使用script命令自动录屏用户操作
  9. Golang之Go Module使用
  10. 2019牛客暑期多校训练营(第九场)-E All men are brothers