VR实现过程(使用VTK官方代码)

VR的介绍

VR(Volume Rendering)也称为体绘制,是一种直接由三维数据场产生屏幕上二维图像的技术。

VR的优点:

  • 可以探索物体的内部结构
  • 可以描述非常定形的物体
  • 面绘制在这些方面比较弱

VR的缺点:

  • 数据存储量大
  • 计算时间较长

实验工具及配置

平台:Windows 10

语言:C++

图像格式:MHD

数据集:使用的是VTK-Example中的FullHead.mhd

​ 也可以使用Promise12 (可以参考 医学影像公开数据集(续))等mhd格式数据

软件 版本 地址
VTK 8.2.0 https://vtk.org/download/
CMake 3.14.0 https://cmake.org/download/
Visual Studio 2017_64 bit https://visualstudio.microsoft.com/zh-hans/vs/older-downloads/

实验步骤

配置环境

安装VS2017

参考博客:VS2017的安装与应用

安装CMake

参考博客:Windows系统 安装 CMake

安装VTK

参考博客:

VTK8.1 在 Qt5.9 环境下的配置、编译和安装

VS2017动态编译VTK8.1.1

实验步骤

编译过程

参考:vtk-examples-FixedPointVolumeRayCastMapperCT

进入VTK官网可以看到关于VR有许多例子,而且每个例子都会有示意图,选择了第一个FixedPointVolumeRayCastMapperCT

  1. 点击here to download FixedPointVolumeRayCastMapperCT后系统会自动下载,并解压:
  1. 该文件夹下包括CMakeLists.txtcxx源文件和一个build文件夹:
  1. 新建source文件夹和testData文件夹,并将CMakeLists.txtcxx源文件移动到source文件:
  1. 打开CMake,打开CMake,source code路径即为VR/FixedPointVolumeRayCastMapperCT/source,build路径即为VR/FixedPointVolumeRayCastMapperCT/build
  1. 点击configure按钮,使用本地编译器,选择Visual Studio 15 2017,并选择x64后点击Finish,之后会出现一片红色,将其中CMAKE_INSTALL_PREFIX的路径改为VR/FixedPointVolumeRayCastMapperCT/build
  1. 继续configure,直到无红色出现,点击generategenerate结束后,打开vs2017,找到build文件夹下的FixedPointVolumeRayCastMapperCT.sln文件选择打开,并将**FixedPointVolumeRayCastMapperCT**设为启动项目,点击本地Windows调试器即可运行。

参数介绍

Example: FixedPointVolumeRayCastMapperCT -DICOM CTNeck -MIP 4096 1024

1
2
3
4
5
6
7
8
9
10
11
12
13
-DICOM <directory>                             // 使用的数据集为 DICOM 格式
-VTI <filename> // 使用的数据集为 VTI 格式
-MHA <filename> // 使用的数据集为 MHA 格式
-DependentComponents // 指定文件具有从属组件
-Clip // 显示用于剪切卷的多维数据集小部件
-MIP <window> <level> // 使用最大强度投影方法
-CompositeRamp <window> <level> // 是非着色合成
-CompositeShadeRamp <window> <level> // 使用着色合成
-CT_Skin // 适用于 DICOM 数据
-CT_Bone // 适用于 DICOM 数据
-CT_Muscle // 适用于 DICOM 数据
-FrameRate <rate> // 控制交互式渲染速率
-DataReduction <factor> // 在渲染前缩减数据
  • 必须使用-DICOM选项指定数据所在的目录,或使用-VTI-MHA选项指定.VTI文件的路径。
  • 默认情况下,程序假定文件具有独立组件,使用-DependentComponents指定文件具有从属组件。
  • 使用-Clip选项显示用于剪切卷的多维数据集小部件。
  • -FrameRate选项与所需的帧速率(以每秒帧数为单位)一起使用,以控制交互式渲染速率。
  • 使用-DataReduction选项和缩减因子(大于零且小于1)在渲染前缩减数据。
  • 使用其余选项之一指定混合函数和传递函数。MIP选项使用最大强度投影方法,而其他选项使用合成。
  • -CompositeRamp选项是非着色合成,而其他合成选项使用着色。
  • 注:MIPCompositeRampCompositeShadeRampCT_SkinCT_BoneCT_Muscle适用于DICOM数据。MIPCompositeRampRGB_Composite适用于RGB数据。

修改源代码

由于VTK官网是在Linux/macOS的终端运行,但已经在本机Windows 10下安装了全套的配置软件,故修改了其中一些代码,使其更直观操作。

源代码如下,并配置了相关判断代码(修改后将判断代码全部注释掉,用以自己直接修改参数),用来判断在终端中输入的参数值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// Parse the parameters

int count = 1; // 可以删去,因为不需要判断,所以计数器无用
char* dirname = NULL; // 如果使用的数据集为Dicom格式,则可修改NULL值为数据集文件夹地址
double opacityWindow = 4096; // opacityWindow大小
double opacityLevel = 2048; // opacityLevel大小

/* blendType
根据参数修改为不同的数字,为不同的效果,其中:
MIP:blendType = 0
-CompositeRamp:blendType = 1
-CompositeShadeRamp:blendType = 2
-CT_Skin:blendType = 3
-CT_Bone:blendType = 4
-CT_Muscle:blendType = 5
-RGB_Composite:blendType = 6
*/
int blendType = 0;
int clip = 0; // 如果上文选择Clip选项,则clip = 1
double reductionFactor = 1.0; // 参数范围在0-1,
double frameRate = 10.0; // 控制交互式渲染速率,渲染前缩减数据
char* fileName = 0; // 如果为VTI格式或MHA/MHD格式,则可修改NULL值为数据文件地址
int fileType = 0; // 文件格式,可直接根据数据集文件进行输入,无需判断
bool independentComponents = true; // 修改不同的数字为不同的效果,下文会有展示

由于采用Windows 10系统,未使用终端,参数修改后如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Parse the parameters

int count = 1;
char *dirname = NULL;
double opacityWindow = 4096;
double opacityLevel = 2048;
int blendType = 0;
int clip = 1;
double reductionFactor = 1.0;
double frameRate = 10.0;
char *fileName = "F://MPR//VR1//FixedPointVolumeRayCastMapperCT//FullHead.mhd";
// char *fileName = "F://MPR//VR1//FixedPointVolumeRayCastMapperCT//TestData//Case00.mhd";
int fileType = MHA_FILETYPE;

bool independentComponents = true;

并将代码中判断参数代码直接注释掉,从while ( count < args )一直到if ( !dirname && !fileName)结束。

实验效果

blendType = 0时:

使用CT_Skin参数时:

----------到结尾啦!! Hoohoo----------