VTK中光线投射法实现体绘制【转】

VTK中光线投射法实现体绘制


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


2、不透明度映射函数
不透明度映射函数是设置光线方向上的灰度值及其不透明度映射。
vtkPiecewiseFunction *opacityTransferFunction = vtkPiecewiseFunction::New();
opacityTransferFunction->AddPoint(10, 0.0);//灰度值及不透明度值
opacityTransferFunction->AddPoint(50,0.1);
opacityTransferFunction->AddPoint(200 ,0.1);
opacityTransferFunction->AddPoint(2900,0.1);
opacityTransferFunction->AddPoint(2950,0.8);
opacityTransferFunction->AddPoint(3050,1);//不透明度值为1则为完全不透明
opacityTransferFunction->ClampingOff();

3、颜色映射函数
颜色映射函数是设置灰度值与RGB颜色的映射。
vtkColorTransferFunction *colorTransferFunction = vtkColorTransferFunction::New();
colorTransferFunction->AddRGBPoint(0.0, 0.91, 0.65, 0.66); //灰度值及RGB颜色值
colorTransferFunction->AddRGBPoint(30.0, 0.91, 0.65, 0.66);
colorTransferFunction->AddRGBPoint(128.0, 0.91, 0.65, 0.66);
colorTransferFunction->AddRGBPoint(1200.0, 0.43, 0.43, 0.43);
colorTransferFunction->AddRGBPoint(1800.0, 0.43, 0.43, 0.43);
colorTransferFunction->AddRGBPoint(2950, .9, 0.0, 0.0);
colorTransferFunction->AddRGBPoint(3050, .9, 0.0, 0.0);
colorTransferFunction->ClampingOff();

4、梯度变换函数
梯度变换函数设置灰度值变换的大小与不透明度之间的映射。
vtkPiecewiseFunction *gradient=vtkPiecewiseFunction::New();
gradient->AddPoint(50,.2);//灰度值变化梯度与不透明度的关系
gradient->AddPoint(1500,.7);
gradient->AddPoint(2000,.1);
5、体数据属性设置
vtkVolumeProperty *volumeProperty = vtkVolumeProperty::New();
volumeProperty->SetColor(colorTransferFunction);//载入颜色映射函数
volumeProperty->SetScalarOpacity(opacityTransferFunction);//载入不透明度映射
volumeProperty->SetGradientOpacity(gradient);//载入梯度映射
volumeProperty->ShadeOn();
volumeProperty->SetInterpolationTypeToLinear();//采用线性插值
6、光线投射函数设置及体绘制映射
本程序采用合成体绘制函数:
vtkVolumeRayCastCompositeFunction*compositeFunction=
vtkVolumeRayCastCompositeFunction::New();
vtkVolumeRayCastMapper *volumeMapper = vtkVolumeRayCastMapper::New();
volumeMapper->SetVolumeRayCastFunction(compositeFunction);//载入体绘制方法
volumeMapper->SetInput(append->GetOutput());//载入图像数据
volumeMapper->SetSampleDistance(.5);
vtkVolume *volume = vtkVolume::New();
volume->SetMapper(volumeMapper);//设置映射
volume->SetProperty(volumeProperty);//设置属性


posted @   白了少年头  阅读(4721)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
点击右上角即可分享
微信分享提示