vtk 体绘制
(2012-06-11 16:58:31)
标签:
杂谈 |
分类: 图像处理(C ) |
操作系统:Windows XP
编程环境:VS2008
VTK版本:vtk-5.8.0
////////////////////////////////////////////////////////////////////////////////////////////
// 说明:体绘制实现三维重建。
// 描述:Ray-casting(光线投射)算法对 DICOM 等格式的切片进行三维重建.
//
体绘制:不同于面绘制,面绘制需要生成中间几何图元,而体绘制是直接绘制,内容需求较面绘制小;每切换一个视角需要重新对所有的像素点进行颜色、透明度等计算,需要时间比面绘制长。
// VTK 主要由图形模型和可视化模型构成。
// 图形模型:vtkRenderWindow(绘制窗口), vtkRenderer(绘制器), vtkLight(光源),
vtkCamera(照相机), vtkActor(角色), vtkProperty(特征),
Transform(变换)。
//
可视化模型:采用数据流方法将各个对象连接成可视化网络结构,最终形成流水线管道(Pipeline),管道是贯穿于VTK的一个核心内容,其每个对象将负责相应的数据处理或用户输入等操作,可视化模型的最高层次是数据源(dataset),其数据一般来自自带的简单数据集或者外部的图像文件。
//
dataset->filter->mapper.
////////////////////////////////////////////////////////////////////////////////////////////
// VTK headers
#include "vtkRenderWindowInteractor.h"
#include "vtkDICOMImageReader.h"
#include "vtkRenderWindow.h"
#include "vtkCamera.h"
#include "vtkActor.h"
#include "vtkRenderer.h"
#include "vtkProperty.h"
#include "vtkPolyDataNormals.h"
#include "vtkImageShiftScale.h"
#include "vtkVolumeRayCastMapper.h"
#include "vtkPiecewiseFunction.h"
#include "vtkColorTransferFunction.h"
#include "vtkVolumeProperty.h"
#include "vtkVolumeRayCastCompositeFunction.h"
#include <iostream>
int main()
{
//标准句子
//定义绘制器
vtkRenderer *aRenderer = vtkRenderer::New();
//定义绘制窗口
vtkRenderWindow *renWin = vtkRenderWindow::New();
renWin->AddRenderer(aRenderer);
//定义窗口交互器
vtkRenderWindowInteractor *iren =
vtkRenderWindowInteractor::New();
iren->SetRenderWindow(renWin);
//CT格式数据读取类
vtkDICOMImageReader *reader =
vtkDICOMImageReader::New();
reader->SetDirectoryName("E:\\2012-2-20\\yixue2\\VIX");
//("E:\\2012-2-20\\yixue2\\OS");
//图像数据预处理。常见两种操作。一种是类型转换,通过 vtkImageShiftScale 将不同类型的数据集转换为
VTK 可以处理的数据;
//另一种是剔除冗余数据,通过 vtkStripper 放置无效的旧单元的存在,提高绘制速度。
vtkImageShiftScale *shiftScale =
vtkImageShiftScale::New();
shiftScale->SetInput(reader->GetOutput());
shiftScale->SetOutputScalarTypeToUnsignedChar();
//数据分类,找出数据与不同物质之间的对应关系,同时也为了在最终图像中以不同颜色表示单一物质的不同属性。
//此处省略
//………………
//透明度映射函数定义
//给数据点赋不透明值。体绘制中,需要显示三维数据场的内部结构,因而需要生成具有透明度的图像。
vtkPiecewiseFunction *opacityTransferFunction =
vtkPiecewiseFunction::New();
opacityTransferFunction->AddPoint(20,
0.0);
opacityTransferFunction->AddPoint(255,
0.2);
//颜色映射函数定义
//给数据点赋颜色值,将分类后的组织信息分别予以不同的颜色,便于图像分析。
vtkColorTransferFunction *colorTransferFunction =
vtkColorTransferFunction::New();
colorTransferFunction->AddRGBPoint(0.0, 0.0,
0.0, 0.0);
colorTransferFunction->AddRGBPoint(64.0, 1.0,
0.0, 0.0);
colorTransferFunction->AddRGBPoint(128.0, 0.0,
0.0, 1.0);
colorTransferFunction->AddRGBPoint(192.0, 0.0,
1.0, 0.0);
colorTransferFunction->AddRGBPoint(255.0, 0.0,
0.2, 0.0);
//体数据属性
vtkVolumeProperty *volumeProperty =
vtkVolumeProperty::New();
volumeProperty->SetColor(colorTransferFunction);
volumeProperty->SetScalarOpacity(opacityTransferFunction);
volumeProperty->ShadeOn();
volumeProperty->SetInterpolationTypeToLinear();
//体绘制惯用语句:
//计算光照效应。采用光线类 vtkVolumeRayCastCompositeFunction 进行投射,
//最终用 vtkVolumeRayCastMapper类进行光效应计算。
vtkVolumeRayCastCompositeFunction *compositeFunction =
vtkVolumeRayCastCompositeFunction::New();
vtkVolumeRayCastMapper *volumeMapper =
vtkVolumeRayCastMapper::New();
volumeMapper->SetVolumeRayCastFunction(compositeFunction);
volumeMapper->SetInput(shiftScale->GetOutput());
vtkVolume *volume = vtkVolume::New();
volume->SetMapper(volumeMapper);
volume->SetProperty(volumeProperty);
aRenderer->AddVolume(volume);
aRenderer->SetBackground(1,1,1);
renWin->SetSize(600, 600);
renWin->Render();
iren->Initialize();
iren->Start();
return 0;
}
前一篇:揭开正则表达式的神秘面纱(转载)
后一篇:VTK 面绘制