vtk 体绘制小结

一  、医学图像三维重建方法


    医学图像三维重建方法可以分为面绘制( Surface Rendering) 和体绘制( Volume Rendering )两大类。面绘制算法中具有代表性的是MC(M a rching Cubes)算法, 它通过对一系列的二维图像进行边界识别等分割原理, 将感兴趣的部分以等值面的方式抽取出来, 从而为用户提供较具真实感的三维图像。这种方法的优点是重建速度较快, 内存资源需求较小, 缺点是易丢失纹理细节。体绘制算法主要包括光线投影算法( Ray Casting ), 脚印法( Spla-tting ), 剪切变形法( Shear- -W a rp ), 其中Ray Casting 算法是体绘制中的经典算法, 它是从投影平面的每一个像素点发射出一条光线, 穿过三维体数据场, 并计算光的传输方程, 得到最后的图像。这种方法的缺点是内存需求大, 绘制速度较慢, 但是它保存了整体细节, 绘制效果较好, 可以很方便地实现一些插值算法。



二 、  VTK 读取DICOM 医学图像  (这个数据的读取函数有很多,根据不同的图像类型我们可以选择不同的数据读取函数)
现有的VTK封装了可以直接读取D ICOM 图像的C + + 类vtkD ICOM Im ageReader, 极大地简化了使用VTK 工具包读取DICOM医学图像的过程。以下为读取DICOM 序列图像的代码:
vtkD ICOM Im ageReader * reader = vtkDICOMImageReader: :New ( ) ;
reader- > SetDataByteOrderToLittleEndian( ) ;
reader- > SetDirectoryNam e( filedirectory ); / / filedirectory 为存放图像的路径
reader- > Update( );


三    、三维重建的实现
本文采用光线跟踪算法( Ray Casting) 作为体绘制的基本算法。基于VTK 类库的体绘制管道模型如图1所示。


四  、 数据类型的转换


vtkIm ag eSh iftScale和v tk ImageCast主要用于数据类型的转换。在图像处理管道中, v tk Im ageCast主要是转换输入数据类型以匹
配输出数据类型, 由函数SetOutputScalarType 来实现。在vtkImageShiftScale, 输入图像被移动和缩放, 主要由以下两个函数实现:

virtualvoidSetShift( double) 和virtualvoidSetScale( double ),

 转换后的像素值= (原像素值+ 平移值) *伸缩值。

与此同时, 这个类也可以通过函数SetOutputSca larType 转换数据类型。本文采用vtkImageShiftScale进行数据转换。在体绘制中传递函数将体数据转换为光学参数, 因此体绘制的效果直接由传递函数决定。


五、     传递函数主要有三类: 

不透明度传递函数、颜色传递函数和梯度传递函数。


1 不透明度传递函数

不透明度传递函数主要是确定各体素的不透明度, 由v tkPieceW iseFunction 来设置, vtkPieceWiseFunction定义了分段函数映射, 由AddPoint( )和AddSegment( )实现数值点的添加。关于这两个函数的具体参数如下:

int AddPoint( double x, double y )
x 代表体素的灰度值, y代表该体素点的透明度, 其范围为[ 0, 1], 0代表完全透明, 1代表完全不透明。
void AddSegment( double x1, doub le y1, double x2, double y2)
这个函数的功能是添加一条直线段, 起点坐标( x1, y1) , 终点坐标( x2, y2), 其含义与上述( x, y)类似。



针对本文所使用的DICOM 医学图像, 不透明度传递函数设置如下:
v tkPiecewiseFunction * opacityTransferFunction = vtkPiecewiseFunction: : New( );
opacityTransferFunction- > AddPo int( 70. 0, 0. 0);
opacityTransferFunction- > AddPo int( 599. 0, 0) ;
opacityTransferFunction- > AddPo int( 600. 0, 0) ;
opacityTransferFunction- > AddPo int( 1195. 0, 0);
opacityTransferFunction- > AddPo int( 1200, . 2) ;
opacityTransferFunction- > AddPo int( 1300, . 3) ;
opacityTransferFunction- > AddPo int( 2000, . 3) ;
opacityTransferFunction- > AddPo int( 4095. 0, 1. 0);


2 颜色传递函数
颜色传递函数主要是确定体素的颜色值或灰度值, 由类vtkColorTransferFunction实现。根据AddRGBPoint( )设置数值点的颜色值。函数具体参数如下:

int AddRGBPoint( double x, double r, double g, double b)

x 代表体素点的灰度值, 含义与上述相同, r代表红色分量, g代表绿色分量, b代表蓝色分量, 他们的范围均为( 0, 1)。

本文颜色传递函数设置如下:
v tkCo lorTransferFunction * co lorTransferFunction = v tkColorTransferFunction: : N ew ( );
co lorTransferFunction- > AddRGBPo int( 0. 0, 0. 5, 0. 0, 0. 0);
co lorTransferFunction- > AddRGBPo int( 600. 0, 1. 0, 0. 5, 0. 5);
co lorTransferFunction- > AddRGBPo int( 1280. 0, 0. 5, 0. 5, 0. 3);
co lorTransferFunction- > AddRGBPo int( 1960. 0, 0. 5, 0. 77, 0. 6);
co lorTransferFunction- > AddRGBPo int( 4095. 0, 0. 5, 0. 9, 0. 9);


3 梯度传递函数

梯度变换函数设置灰度值变换的大小与不透明度之间的映射。
vtkPiecewiseFunction *gradient=vtkPiecewiseFunction::New();
gradient->AddPoint(50,.2);//灰度值变化梯度与不透明度的关系
gradient->AddPoint(1500,.7);
gradient->AddPoint(2000,.1);


六 、   体数据属性设置


vtkVolumeProperty *volumeProperty = vtkVolumeProperty::New();
volumeProperty->SetColor(colorTransferFunction);//载入颜色映射函数
volumeProperty->SetScalarOpacity(opacityTransferFunction);//载入不透明度映射
volumeProperty->SetGradientOpacity(gradient);//载入梯度映射
volumeProperty->ShadeOn();
volumeProperty->SetInterpolationTypeToLinear();//采用线性插值


七、  体绘制函数


VTK 为使用者提供了三种用于光线投射法的函数分别是:
等值面绘制函数(vtkVolumeRayCastIsosurfaceFunction);
最大密度投影函数(vtkVolumeRayCastMIPFunction);
合成体绘制函数(vtkVolumeRayCastCompositeFunction)
其中最常用的是合成体绘制函数,最大密度投影函数在显示血管影像方面有比较好的作用。但是如图所看到的,MIP函数没有空间立体感,也就是不能提供深度的信息。

这里使用 合成体绘制函数:

vtkVolumeRayCastCompositeFunction*compositeFunction=vtkVolumeRayCastCompositeFunction::New();


八   、 映射器 创建映射器 这是VTK 数据流的基础部分


vtkVolumeRayCastMapper *volumeMapper = vtkVolumeRayCastMapper::New();

volumeMapper->SetVolumeRayCastFunction(compositeFunction);//载入体绘制方法

volumeMapper->SetInput(append->GetOutput());//载入图像数据

volumeMapper->SetSampleDistance(.5);


九、   提数据volume   这相当与演员或者说角色actor 这是提渲染数据的角色  

vtkVolume *volume = vtkVolume::New();

volume->SetMapper(volumeMapper);//设置映射

volume->SetProperty(volumeProperty);//设置角色属性


十、  最后将角色与渲染器render 绑定,并添加渲染窗口renderWindows , 完成绘制。

下面是数据流 很好 便于理解



  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值