最近在做VTK体绘制的学习,中途花费了大量的时间,进展十分缓慢,最终成功,将个中细节公布出来,以飨后人

来源:互联网 发布:sql重庆培训 编辑:程序博客网 时间:2024/04/29 22:59

不知道什么原因,国内有关VTK,体绘制的博客少之又少,大部分内容也多互相借鉴,有价值的信息少之又少,大部分代码也存在着各种各样的问题

也可能因为我才疏学浅,配置上有一定的问题,但是99%的代码都不能成功运行,十分不利于初学者学习,因此想到在成功以后将自己的代码Po上,

方便大家学习交流

关键词:VTK7.0 CMAKE 体绘制 VolumeRender 高斯滤波 各向异性扩散滤波  .RAW文件读取 VolumeMapper

代码:

#include <vtkSmartPointer.h>
#include <vtkSmartVolumeMapper.h>
#include <vtkColorTransferFunction.h>
#include <vtkPiecewiseFunction.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkVolumeProperty.h>
#include <vtkCamera.h>
#include <vtkImageData.h>
#include <vtkImageReader.h>
#include <vtkVolumeRayCastMapper.h>
#include <vtkImageGaussianSmooth.h>
#include <vtkImageAnisotropicDiffusion2D.h>
static void CreateImageData(vtkImageData* im);
int main(int argc, char *argv[])
{
vtkSmartPointer<vtkImageData> imageData = 
vtkSmartPointer<vtkImageData>::New();
CreateImageData(imageData);
//*********************************************************调用函数 创建图像


vtkSmartPointer<vtkRenderWindow> renWin = 
vtkSmartPointer<vtkRenderWindow>::New();
vtkSmartPointer<vtkRenderer> ren1 = vtkSmartPointer<vtkRenderer>::New();
ren1->SetBackground(0.1,0.4,0.2);
renWin->AddRenderer(ren1);
renWin->SetSize(500,500); 
vtkSmartPointer<vtkRenderWindowInteractor> iren = 
    vtkSmartPointer<vtkRenderWindowInteractor>::New();
iren->SetRenderWindow(renWin);
renWin->Render(); 
//********************************************************创建窗口
vtkSmartPointer<vtkSmartVolumeMapper> volumeMapper = 
vtkSmartPointer<vtkSmartVolumeMapper>::New();
volumeMapper->SetBlendModeToComposite();
volumeMapper->SetInputData(imageData); 
vtkSmartPointer<vtkVolumeProperty> volumeProperty = 
vtkSmartPointer<vtkVolumeProperty>::New();
volumeProperty->ShadeOff();
volumeProperty->SetInterpolationType(VTK_LINEAR_INTERPOLATION);
//*********************************************************Mapper
vtkSmartPointer<vtkPiecewiseFunction> compositeOpacity = 
vtkSmartPointer<vtkPiecewiseFunction>::New();
compositeOpacity->AddPoint(10, 0.0);//灰度值及不透明度值
compositeOpacity->AddPoint(50, 0.1);
compositeOpacity->AddPoint(200, 0.1);
compositeOpacity->AddPoint(2900, 0.1);
compositeOpacity->AddPoint(2950, 0.8);
compositeOpacity->AddPoint(3050, 1);//不透明度值为1则为完全不透明
compositeOpacity->ClampingOff();
volumeProperty->SetScalarOpacity(compositeOpacity); // composite first.
vtkSmartPointer<vtkColorTransferFunction> color = 
    vtkSmartPointer<vtkColorTransferFunction>::New();
color->AddRGBPoint(0.0  ,0.0,1.0,1.0);
color->AddRGBPoint(40.0  ,0.69,0.06,0.09);
color->AddRGBPoint(200.0,0.8,0.9,0.9);
color->AddRGBPoint(1200.0, 0.43, 0.43, 0.43);
color->AddRGBPoint(1800.0, 0.43, 0.43, 0.43);
volumeProperty->SetColor(color);
vtkPiecewiseFunction *gradient = vtkPiecewiseFunction::New();
gradient->AddPoint(0, .25);//灰度值变化梯度与不透明度的关系
gradient->AddPoint(40, .7);
gradient->AddPoint(200, .5);
volumeProperty->SetGradientOpacity(gradient);
//*********************************************************设置绘制参数:颜色,透明度
volumeProperty->SetInterpolationTypeToLinear();//采用线性插值
vtkSmartPointer<vtkVolume> volume =
vtkSmartPointer<vtkVolume>::New();
volume->SetMapper(volumeMapper);
volume->SetProperty(volumeProperty);
ren1->AddViewProp(volume);
//*********************************************************参数传递
ren1->ResetCamera();
renWin->Render();
// volumeMapper->SetRequestedRenderModeToRayCast();
volumeMapper->SetRequestedRenderModeToGPU();
renWin->Render();
iren->Start();
return EXIT_SUCCESS;
}


void CreateImageData(vtkImageData* imageData)
{
  vtkImageReader *reader = vtkImageReader::New();
  reader->SetFileName("F:\\bone.raw");
  reader->SetFileDimensionality(3);//设置显示图像的维数
  reader->SetDataScalarType(VTK_UNSIGNED_CHAR);//VTK_UNSIGNED_short将数据转换为unsigned char型
  reader->SetDataExtent(0, 255, 0, 255, 1, 106);//图片属性图片像素256x256 NOTICE(0,255)表示从0到255
  reader->SetDataSpacing(0.87, 0.87, 2.0); //设置像素间间距
  reader->SetDataOrigin(0, 0, 0);
  reader->Update();


  
  vtkImageReader *reader2 = vtkImageReader::New();
  reader2->SetFileName("F:\\walnut-shell-mask.raw");
  reader2->SetFileDimensionality(3);//设置显示图像的维数
  reader2->SetDataScalarType(VTK_UNSIGNED_CHAR);//VTK_UNSIGNED_short将数据转换为unsigned char型
  reader2->SetDataExtent(0, 399, 0, 295, 1, 352);//图片属性图片像素400X296 最后两个参数设置图像个数
  reader2->SetDataSpacing(1.0, 1.0, 1.0); //设置像素间间距
  reader2->SetDataOrigin(0.0, 0.0, 0.0);




  vtkImageReader *reader4 = vtkImageReader::New();
  reader4->SetFileName("F:\\walnut-core-mask.raw");
  reader4->SetFileDimensionality(3);//设置显示图像的维数
  reader4->SetDataScalarType(VTK_UNSIGNED_CHAR);//VTK_UNSIGNED_short将数据转换为unsigned char型
  reader4->SetDataExtent(0, 399, 0, 295, 1, 352);//图片属性图片像素256x256,最后两参数表示有124张图
  reader4->SetDataSpacing(1.0, 1.0, 1.0); //设置像素间间距
  reader4->SetDataOrigin(0.0, 0.0, 0.0);




  vtkImageReader *reader3 = vtkImageReader::New();
  reader3->SetFileName("F:\\mouse0.raw");
  reader3->SetFileDimensionality(3);//设置显示图像的维数
  reader3->SetDataScalarType(VTK_UNSIGNED_SHORT);//VTK_UNSIGNED_short将数据转换为unsigned char型
  reader3->SetDataExtent(0, 149, 0, 149, 1, 276);//图片属性图片像素256x256,最后两参数表示有124张图
  reader3->SetDataSpacing(1.0, 1.0, 1.0); //设置像素间间距
  reader3->SetDataOrigin(0.0, 0.0, 0.0);


 /* vtkSmartPointer<vtkImageGaussianSmooth> gaussianSmoothFilter =
 vtkSmartPointer<vtkImageGaussianSmooth>::New();
  gaussianSmoothFilter->SetInputConnection(reader->GetOutputPort());
  gaussianSmoothFilter->SetDimensionality(3);
  gaussianSmoothFilter->SetRadiusFactor(5);
  gaussianSmoothFilter->SetStandardDeviation(3);
  gaussianSmoothFilter->Update();
  imageData->ShallowCopy(gaussianSmoothFilter->GetOutput());*/
  //************************************************************高斯滤波,效果不错 但是会丢失部分细节
  vtkSmartPointer<vtkImageAnisotropicDiffusion2D> diffusion = vtkSmartPointer<vtkImageAnisotropicDiffusion2D>::New();
  diffusion->SetInputConnection(reader4->GetOutputPort());
  diffusion->SetNumberOfIterations(10);
  diffusion->SetDiffusionThreshold(20);
  diffusion->Update();
  imageData->ShallowCopy(diffusion->GetOutput());
  //***********************************************************各向异性扩散滤波,效果不错,不会丢失细节,
  //***********************************************************但是由于采用多次迭代方式,需要大量绘制时间并且在
  //***********************************************************绘制时会占用大量cpu资源,本例采用了效果更好的各向异性扩散滤波
}

CMAKELIST:



cmake_minimum_required(VERSION 2.8)


PROJECT(SmartVolumeMapper)


find_package(VTK REQUIRED)
include(${VTK_USE_FILE})


add_executable(SmartVolumeMapper MACOSX_BUNDLE SmartVolumeMapper)


if(VTK_LIBRARIES)
  target_link_libraries(SmartVolumeMapper ${VTK_LIBRARIES})
else()
  target_link_libraries(SmartVolumeMapper vtkHybrid vtkWidgets)
endif()

说明:

1 本例实现了对.RAW文件的读取,使用SmartVolumeMapper进行体绘制 得出图像,并使用各向异性滤波方式对图像进行了优化

2 本例使用CMAKELIST方式生成项目编译运行,同样,十分推荐新手学习使用CMAKELIST方式,不推荐新建工程再导入依赖文

件的方式,太过复杂,成功率也很低

3 本例不提供VTK安装的方法,请移步

4 版本:VTK7.0 cmake3.7



1 0