体绘制的速度问题是困扰医学图像三维重建的关键环节,通过总结,得到了以下几种提高体绘制速度的方法:
方法一:介绍一下vtkImageResample,这个函数将会通过线性插值对输入数据的spacing以及extent进行修改,来达到对输入数据的重新采样。一般采用SetAxisMagnificationFactor的方法来进行设置如下所示:
vtkImageResample:
SetInput(reader->GetOutput());
SetAxisMagnificationFactor(0, 0.5);
SetAxisMagnificationFactor(1, 0.5);
方法二:对读入的数据可以进行 subsampling(二次抽样样品),这样也可以使程序很数据读入加快。如下所示:
vtkImageShrink3D shrink
SetInput(reader->GetOutput());
SetShrinkFactors(3,3,3)
AveragingOn
SetShrinkFactors 定义了x,y,z 抽样精密度 如果都是0 那么就没有必要用这个函数了,如果subsampling得值过大,那么rendering的结果会比较差。在这个时候如果对subsamping得数据进行优化显示是一个值得讨论的问题。
优化的方法可以选在高斯平滑的函数进行,这样可以减少数据的梯度感和粗糟感,代码如下
vtkImageGaussianSmooth:
SetInputConnection(reader->GetOutput());
SetDimensionality(3)
SetRadiusFactors(1,1,0)
方法三:重新设置SampleDistance。对于使用vtkVolumeRayCastMapper来说。使用函数SetImageSampleDistance来进行设置,但同时,因为在默认状态下,它具有为了达到交互效果而自动调节显示效果的功能,所以前提必须是RayCastMapper 的自动调节功能已经关掉,(如果仍然采用自动调节作用,则可以通过SetAutoAdjustSampleDistances (int)来进行交互设置)即AutoAdjustSampleDistancesOff();如下所示:
vtkVolumeRayCastMapper:
SetImageSampleDistance(2);
AutoAdjustSampleDistancesOff();
方法四:使用vtkLODProp3D。它允许加入多个Mapper,并通过设置time,来决定某一时刻应该显示哪一个Mapper。通常的做法是当在旋转时选择交互性好但准确率稍差的Mapper,当停止时,又会显示比较费时但绘制准确的Mapper。对于RayCastMapper来说,则不需要使用vtkLODProp3D。如下所示:
vtkVolumeTextureMapper2D *lowresMapper = vtkVolumeTextureMapper2D::New();
lowresMapper->SetInput(reader->GetOutput());
vtkVolumeRayCaster *hiresMapper = vtkVolumeRayCaster::New();
hiresMapper->SetInput(reader->GetOutput());
vtkLODProp3D *volumeLOD = vtkLODProp3D::New();
volumeLOD->AddLOD(lowresMapper, volumeProperty, 0.0);
volumeLOD->AddLOD(hiresMapper, volumeProperty, 0.0);