VTK:体绘制——光线投影+最大密度投影+等值面法

1.vtkVolumeMapper

vtkVolumeMapper是所有体绘制Mapper类的虚基类,提供接口函数,并由其子类实现具体功能。该类的继承关系如下:
在这里插入图片描述

2.光线投射:vtkVolumeRayCastMapper

光线投投射法是最常用的体绘制方法。它是一种基于图像序列的直接体绘制方法。光线投影法的基本原理是从投影图像平面(通常为平面)的每个像素沿着视线方向发射一条穿过体数据的射线,然后在射线上按照一定的步长进行等距离采样,对每个采样点采用插值技术来计算其体素值,根据颜色传输颜色传输函数和不透明度传输函数来获取相应的颜色值和不透明度,最后利用光线吸收模型将颜色值进行累加直至管线穿过体数据。这样,就可以得到当前平面像素的渲染颜色,最终生产显示图像。
光线投影法的优点是能够比较精确地模拟原始数据,但是计算量较大,实时体绘制对计算机硬件的要求比较高。
在VTK中,VTKVolumerRayCastMapper类可用于实现光线投影体算法,并生成图元数据传递给vtkVolume对象进行渲染。
vtkVolumeRayCastMapper类采用软件的方法实现光线投影算法,精度高但是计算量比较大,因此渲染的速度相对比较慢。
该类内部实现了两个非常重要的函数:
vtkVolumeRayCastMapper::SetInput(vtkImageData*):该函数用于设置输入图像数据;
vtkVolumeRayCastMapper::SetVolumeRayCastFunction(vtkVolumeRayCastFunction*):该类用于设置光线投射函数。
vtkVolumeRayCastMapper中计算每条光线在通过体数据后的颜色是通过定义的vtkVolumeRayCastFunction对象来实现的。因此,必须为vtkVolumeRayCastMapper指定一个vtkVolumeRayCastFunction对象,vtkVolumeRayCastFunction是一个虚基类,他包含三个子类。
2.1vtkVolumeRauCastCompositeFunction该方法通过Alpha合成技术生产每个像素的颜色值。对于每一条光线在穿过体数据时,先根据设置的采样步长进行采样,通过插值技术来计算每个采样点的像素值;然后根据vtkVolumeProperty中设置颜色传输函数和不透明传输函数来计算采样点的颜色和不透明度。最后,对所有采样点采用Alpha合成方法计算最终的颜色。
另外,该方法还可以设置插值优先还是分类优先。插值优先是值对投射光线进行采样,计算采样点的颜色时,先根据插值方式计算该采样点的标量值(灰度值),然后再根据颜色传输函数和不透明度传输函数计算该点的颜色值和不透明度。分类优先是值在计算采样点时,先根据颜色传输函数和不透明度传输函数计算包含该采样点的立方体的8个顶点颜色和不透明度,然后通过插值方法获取当前采样点的颜色值与不透明度。选择插值优先还是分类优先要通过以下两个函数:
SetCompositeMethodTolnterpolateFirst()
SetCompositeMethodToClassifyFirst()
从显示效果上来说,插值优先的效果具有较好的显示效果,但在一些情况下也会存在问题。
例如,CT图像中,低于20的值属于空气,20~80的部分是软组织,大于80部分是骨骼。如果先进行插值,那么空气与骨骼之间永远不会相邻,因为他们之间一定存在软组织。但是,我们的牙齿是和空气直接接触的,当使用插值优先策略并使用比较高的采样率进行体绘制时,渲染结果会使牙齿看起来像是覆盖了一层皮肤。
2.2vtkVolumeRayCastMIPFFunction
最大密度投影函数主要对于体数据中高灰度值得结构化进行可视化。当光线穿过体数据时,在光线上进行等距采样。取采样点中属性最大值为该条光线的输出。光线对应的屏幕像素颜色值就可以通过该值进行颜色映射获得。默认情况下,这个属性是值体数据的像素或者体数据的不透明度,其设置函数:

  • SetMaximizeMethodToScalarValue()
  • SetMaximizedMethodToOpacity()
    当采用标量(灰度)属性时,先经过体数据的光线进行等距离采样,然后通过插值计算每个采样点的标量值,最后取标量值为最大的采样点对应的颜色和不透明度作为输出;当采样值不透明度作为输出时,投射光线上每次采样都要计算一次不透明度,最后取不透明度最大值的采样点的颜色和不透明作为输出。通常,最大强度投影算法不计算敏感信息和深度信息,成像类似于X光,该方法常用于显示血管三维结构。该类的使用方法也是非常简单。
vtkSmartPoint<vtkVolumeRayCastMIPFunction> rayCastFun =
vtkSmartPointer<vtkVolumeRayCastMIPFunction>::New();

2.3vtkVolumeRayCastIsosurfaceFunction
对等值绘制函数能够渲染体数据中的特定的等值面,其中,SetIsoValue(double)函数用于设置等值面的值。在进行体绘制,所有小于该值的像素不透明度都设置为0.通过设置等值面的值,可以重建处某一特定的的组织,如皮肤、骨骼,渲染结果类似于面绘制。同样地,使用该函数进行图绘制,代码如下
vtkSmartPointer<vtkVolumeRayCastIsosurfaceFunction> rayCastFun = vtkSmartPointer<vtkVolumeRayCastIsosurfaceFunction>::New(); rayCastFun->SetIsoValue(100);
这三种体绘制输出结果:

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

3.光线投影体绘制
3.1 讨论投影光线上的采样点的步长
光线投影体绘制中,投影光线上采样上的步长还一个重要的参数,决定了体绘制的精度和速度。步长越小,采样点就越多,但是体绘制效果提高的同时计算量也会增加。vtkVolumeRayMapper中设置步长函数为:Void SetSampleDistance(float);
这里需要注意的是,等值面绘制函数不需要进行采样,而其他另个绘制函数需要进行采样。在实际应用中,调整采样步长主要考虑的因素有样本间距、标量数据以及数据映射的颜色和不同明度变化率。vtkvolumeRayCast Mapper中默认的采用步长为1;单位为世界坐标系。
实际应用过程中,如果体数据变化比较剧烈,应该适当减少采样步长以获得比较精细的渲染结果,代价就是速度的减低。

3.2 讨论二:图像采样间距(投影光线间隔)
默认情况下,图像采样间距为1,即每个像素对应一条投影光线;如果设为0.5,那么每个像素对应4条投影光线;如果设置为2,则每四个像素对应一条投影光线。设置图像采样距离的函数:
void SetImageSampleDistance(float);
当使用这个函数的时候,必须先关闭自动调节采样距离功能,代码如下:
SetAutoAdjustSampleDistance(0); //关闭自动调整采样
默认情况下,该函数的功能是开启的,以保证在图像旋转等交互时,能够自动调整采样距离保证实时性。如果关闭此功能,在旋转图像等交互过程中,体绘制渲染过程会变得很慢。当然,即使我们采用自动调整图像采样距离,也可以设定它的范围
,控制函数为:
void SetMaximunImageSampleDistance(float); void SetMinimumImageSampleDistance(float);
步长越小,渲染越精细,渲染的时间越长。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

简 。单

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值