好文档 - 专业文书写作范文服务资料分享网站

VTK体绘制

天下 分享 时间: 加入收藏 我要投稿 点赞

? 渲染技术

? 几何渲染技术:通过绘制几何图元(顶点、线段、面片等)来渲染数据。绘制图像

时先在空间中建立一个四边形图元,然后以纹理映射的方式将图像贴图到该图元上进行渲染;绘制三维模型时通常会分解一系列的多边形面片进行绘制。速度快,但是不能显示体数据内部的细节。例如渲染人的三维CT体数据时,通过几何渲染只能在切片图像之间进行切换,而不能对体数据内部细节进行立体观察。

? 体绘制:三维重建,直接利用体数据来生成二维图像的绘制技术。与面绘制不同,

体绘制不需要提取体数据内部的等值面,它是对三维体数据进行采样和合成的过程。能通过设置不透明度值来显示体数据内部的不同成分和细节。

两种方法的不同点主要在Mapper和Actor/Volume处。

? vtkVolumeMapper:所有体绘制Mapper类的虚基类,提供接口函数,并由其子类实

现具体功能。

? vtkVolumeRayCastMapper:光线投射法,基于图像序列的最常用的体绘制方法。

? 基本原理:从投影图像平面的每个像素沿着视线方向发射一条穿过体数据的射

线,然后在射线上按照一定的步长进行等距采样,对每个采样点采用插值技术来计算其体素值,根据颜色传递函数和不透明度传递函数来获取相应的颜色值和不透明度,最后利用光线吸收模型将颜色值进行累加直至管线穿过体数据。 ? 投影光线上的采样点步长:决定了体绘制的精度和速度,步长越小,采样点就

越多,提高体绘制效果的同时计算量也会增加。SetSampleDistance(float)。调整采样步长主要考虑的因素有样本间距、标量数据以及标量数据映射的颜色和不同明度变化率。

? 图像采样间距/投影光线间隔:默认采样间距为1,每个像素对应一条投影光

线;设置为0.5,每个像素对应4条投射光线;设置为2,每4个像素对应一条投影光线。SetImageSampleDistance(float)

先用SetAutoAdjustSampleDistance(0);关闭自动调整采样,默认情况下该函数的功能是开启的,以保证在图像旋转等交互时,能够自动调整采样距离以保证实时性。关闭该功能,在旋转图像等交互过程中,体绘制渲染过程会很慢。采样自动调整图像间距时,可以设定它的范围:

SetMaximunImageSampleDistance(f) / SetMinimumImageSampleDistance(f) ? 优点:比较精确的模拟原始体数据;

? 缺点:计算量较大,实时体绘制对计算机硬件的要求比较高。

SetInput(vtkImageData*):用于设置输入图像数据

? SetVolumeRayCastFunction(vtkVolumeRayCastFunction*):设置光线投射函数 ? vtkVolumeRayCastFunction:光线投射函数,计算每条光线通过体数据后的颜色。

? vtkVolumeRauCastCompositeFunction:通过alpha合成生成每个像素的颜

色值。每条光线在穿过体数据时,先根据设置的采样步长进行采样,通过插值技术计算每个采样点的值,然后根据vtkVolumeProperty中设置的颜色传递函数和不透明度传递函数计算采样点的颜色和不透明度,最后对所有的采样点采用alpha合成方法计算最终的颜色。可以设置插值优先还是分类优先:插值优先是指先通过插值方式计算采样点的标量值/灰度值,再根据颜色传输函数和不透明度传输函数计算该点的颜色值和不透明度值;分类优先是指在计算采样点时,先根据颜色传输函数和不透明度传输函数计算包含该采样点的立方体的8个顶点的颜色和不透明度,然后通过插值方法获取当前采样点的颜色值和不透明度值。用以下两个函数设置优先方法,通常插值优先具有较好的效果: SetCompositeMethodToInterpolateFirst()/SetCompositeMethodToClassifyFirst() ? vtkVolumeRayCastMIPFunction:最大密度投影函数,对体数据中高灰度值的

结构进行可视化。当光线穿过体数据时,在光线上进行等距采样,取采样点中属性最大值为该条光线的输出。光线对应的屏幕像素颜色值就可以通过该值进行颜色映射获得。默认情况下,这个属性是指体数据的像素值或者不透明度。 setMaximizeMethodToScalarValue():用标量值/灰度属性时,先对经过体数据的光线进行等距离采样,然后通过插值计算每个采样点的标量值,最后取标量值最大的采样点对应的颜色和不透明度作为输出。

SetMaximizedMethodToOpacity():用不透明度作为输出时,投射光线每次采样计算一次不透明度,最后取不透明度最大值的采样点的颜色和不透明度。 ? vtkVolumeRayCastIsosurfaceFunction:用等值面绘制函数渲染体数据中的特

定等值面,SetIsoValue(double)函数用于设置等值面的值。在进行体绘制时,所有小于该值的像素的不透明度都设置为0,通过设置等值面的值,可以重建某一特定的组织,如皮肤、骨骼等,渲染结果类似与面绘制。不需要采样。

? 纹理映射体绘制:基于软件实现的光线投射的体绘制计算量大,不利于进行实时渲染,

因此目前体绘制经常使用图形硬件利用纹理映射来加速。将三维体数据作为纹理转载入硬件缓存中,利用硬件来实现插值以及图像合成操作,以提高绘制效率。

? 基于图形硬件的三维纹理功能的体绘制技术:利用硬件的三线性过滤插值能力,通

过渲染多个与视线垂直的面片来重建整个三维结构。每个面片利用三维纹理来决定颜色和透明度。直接利用三维纹理在图形硬件上实现光线投影算法。

? 二维纹理映射:将每个坐标轴方向的切片作为二维纹理保存到图形硬件缓冲中,在

光线投射时,选择与当前视线方向垂直的一组纹理图像,在硬件中进行插值和合成运算,以实现体绘制。vtkVolumeTextureMapper2D基于二维纹理映射的体绘制。 ? 三维纹理映射:将体数据映射至一组与视图平面平行的多边形,避免了二维纹理映

射中因为纹理图像的切换造成的瑕疵。vtkVolumeTextureMapper3D,受硬件纹理空间限制,当数据传递至vtkVolumeTextureMapper3D中后,在内部会进行重采样,以确保图像大小能够满足当前的纹理空间。默认情况下,对于单组分数据的纹理最大为256:256:128,四元非独立数据最大为256:128:128。三维纹理映射仅支持两种类型的显卡:NVIDIA和ATI。为了确保程序能够正常运行,其内部定义了核对函数int IsRenderSupported(vtkVolumeProperty*, vtkRenderer*),用该函数来判断是否支持渲染以避免错误。volumeMapper-> IsRenderSupported(volumeProperty, ren);当软件程序检查到显卡类型满足时,就会返回TRUE。

? 体绘制渲染总结:vtk中不同的vtkVolumeMapper支持不同的数据类型。

vtkVolumeRayCastMapper和vtkVolumeTextureMapper2D支持VTK_UNSIGNED_CHAR和VTK_UNSIGNED_SHORT类型数据。当涉及到其它类型数据时,需要做数据强制转换,可以考虑使用vtkImageCast或vtkImageShiftScale类。vtkVolumeTexturesMapper3D则支持任意类型数据,当然必须是单组分数据或者是多元独立数据。

vtkFixedPointVolumeRayCastMapper灵活性最高,支持所有类型,可以支持四元数据。 ? 体绘制裁剪:对于一些体积比较大,结构比较复杂的体数据进行体绘制的渲染效果难以

展示其内部细节,需要用到裁剪技术来渲染部分数据。vtkVolumeMapper提供了两种裁剪技术Cropping和Clipping。

? Cropping只支持vtkImageData数据的裁剪,该方法在每个坐标轴上定义两个裁剪

面,共有6个裁剪面xmin/xmax/ymin/ymax/zmin/zmax,将三维空间分为27个可视区域,这些裁剪面仅与数据的原点和像素尺寸有关,而不依赖于数据的任何坐标运算,因此可以使用27为数字来定义这些区域,每一位表示一个区域。当某位上数字为1时,说明显示其对应的区域。在这些区域中,小于(xmin, ymin)的区域为第一位,然后根据先x轴方向,再y轴方向,最后z轴方向的顺序来定义每个区域的位号。例如,只显示中间区域时,其对应的27位数字为0x0002000。 volumeMapper->SetCropping(1); // 开启Crooping功能

volumeMapper->SetCroopingRegionPlanes(50, 150, 50, 200, 50, 150); // 设置区域 volumeMapper->SetCroppingRegionFlags(0x0002000);

? Clipping支持vtkImageData和vtkUnstructuredGrid类,由vtkAbstractMapper3D

类提供,对使用基于OpenGL的硬件裁剪技术的Mapper类,如vtkPolyDataMapper、vtkVolumeTextureMapper2D、vtkProjectedTetrahedraMapper等,当设置的裁剪面个数超过OpenGL支持的个数(一般为6)时,VTK会反馈一个错误;对基于软件的裁剪技术的Mapper类,如vtkVolumeRayCastMapper则没有这些限制,可以支持任意多个裁剪面。使用Clipping技术,可以沿着任意方向将图像切开,便于观察体数据内部细节。和vtkPlane结合使用,mapper->AddClippingPlane(plane);

? 不透明度传递函数: vtkPiecewiseFunction类是分段线性映射函数,作为标量值不透明

度传递函数时将光线投射过程中的采样点的灰度值映射为不同的不透明度值,作为梯度不透明度传递函数将梯度模值映射为一个不透明度乘子,从而增强过渡区域的显示效果。作为体数据的属性进行添加:

property->SetScalarOpacity(compositeOpacity); //设置标量值不透明度传递函数 property->GetScalarOpacity(); // 获取标量值不透明度传递函数

property->SetGradientOpacity(volumeGradientOpacity);//设置梯度不透明度传递函数 property->GetGradientOpacity(); // 获取梯度不透明度传递函数

? Clamping标志:值为真时,对于小于所有断点最小灰度值的灰度值,其映射为最

小灰度值断点对应的映射之;对于大于所有断点最大灰度值的灰度值,其映射值为最大灰度值断点对应的映射值;值为假时,所有位于断点灰度值范围之外的灰度对应映射值都为零。

? 颜色传递函数:将标量值映射为颜色值,颜色值可以是RGB值或HSV值,对应不同的

添加断点的方法,x表示像素灰度值,r/h,g/s,b/v为映射的RGB/HSV颜色分量。 int AddRGBPoint(double x, double r, double g, double b); int AddHSVPoint(double x, double h, double s, double v);

void AddRGB/HSVSegment(double x1, double r/h1, double g/s1, double b/v1, double x2, double r/h2, double g/s2, double b/v2);

VTK体绘制

?渲染技术?几何渲染技术:通过绘制几何图元(顶点、线段、面片等)来渲染数据。绘制图像时先在空间中建立一个四边形图元,然后以纹理映射的方式将图像贴图到该图元上进行渲染;绘制三维模型时通常会分解一系列的多边形面片进行绘制。速度快,但是不能显示体数据内部的细节。例如渲染人的三维CT体数据时,通过几何渲染只能在切片图像之间进行切换,而不能对体数据内部细节进行立体观察
推荐度:
点击下载文档文档为doc格式
1d49u8s0107zlrl1bkfq6d7jn4l91z0136v
领取福利

微信扫码领取福利

微信扫码分享