VTK:读取raw图片格式进行体绘制

来源:互联网 发布:医学数据分析是搞什么 编辑:程序博客网 时间:2024/06/09 19:19
#include "vtkDICOMImageReader.h"#include "vtkPiecewiseFunction.h"#include "vtkColorTransferFunction.h"#include "vtkVolumeProperty.h"#include "vtkVolumeRayCastCompositeFunction.h"#include "vtkVolumeRayCastMapper.h"#include "vtkVolume.h"#include "vtkRenderer.h"#include "vtkRenderWindow.h"#include "vtkRenderWindowInteractor.h"#include "vtkImageCast.h"#include "vtkInteractorStyleTrackballCamera.h"#include "vtkBMPReader.h"#include "vtkVolume16Reader.h"#include "vtkPNGReader.h"#include "vtkJPEGReader.h"#include "vtkRayCastImageDisplayHelper.h"#include <vtkSmartPointer.h>void main(){vtkSmartPointer<vtkRenderer> ren = vtkSmartPointer<vtkRenderer>::New();//设置绘制者(绘制对象指针)vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();//设置绘制窗口renWin->AddRenderer(ren);//将绘制者加入绘制窗口vtkSmartPointer<vtkRenderWindowInteractor> iren = vtkSmartPointer<vtkRenderWindowInteractor>::New();//设置绘制交互操作窗口的iren->SetRenderWindow(renWin);//将绘制窗口添加到交互窗口vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();//交互摄像机iren->SetInteractorStyle(style);//style为交互模式vtkSmartPointer<vtkImageReader> reader = vtkSmartPointer<vtkImageReader>::New();reader->SetFileName("C:\\Users\\HuangWang\\Desktop\\Head_256x256x256.raw");reader->SetFileDimensionality(3);//设置显示图像的维数reader->SetDataScalarType(VTK_UNSIGNED_CHAR);//VTK_UNSIGNED_short将数据转换为unsigned char型reader->SetDataExtent(0, 255, 0, 255, 0, 255);reader->SetDataSpacing(0.9, 0.9, 0.9); //设置像素间间距reader->SetDataOrigin(0.0, 0.0, 0.0);//设置基准点,(一般没有用)做虚拟切片时可能会用的上reader->Update();vtkSmartPointer<vtkImageCast> readerImageCast = vtkSmartPointer<vtkImageCast>::New();//数据类型转换readerImageCast->SetInputConnection(reader->GetOutputPort());readerImageCast->SetOutputScalarTypeToUnsignedChar();readerImageCast->ClampOverflowOn();//阀值//reader->Delete();//设置不透明度传递函数//该函数确定各体绘像素或单位长度值的不透明度vtkSmartPointer<vtkPiecewiseFunction> opacityTransferFunction = vtkSmartPointer<vtkPiecewiseFunction>::New();//一维分段函数变换opacityTransferFunction->AddPoint(20, 0.0);opacityTransferFunction->AddPoint(255, 0.2);//设置颜色传递函数//该函数确定体绘像素的颜色值或者灰度值vtkSmartPointer<vtkColorTransferFunction> colorTransferFunction = vtkSmartPointer<vtkColorTransferFunction>::New();colorTransferFunction->AddRGBPoint(0.0, 0.0, 0.5, 0.0);//添加色彩点(第一个参数索引)colorTransferFunction->AddRGBPoint(60.0, 1.0, 0.0, 0.0);colorTransferFunction->AddRGBPoint(128.0, 0.2, 0.1, 0.9);colorTransferFunction->AddRGBPoint(196.0, 0.27, 0.21, 0.1);colorTransferFunction->AddRGBPoint(255.0, 0.8, 0.8, 0.8);vtkSmartPointer<vtkVolumeProperty> volumeProperty = vtkSmartPointer<vtkVolumeProperty>::New();//设定一个体绘容器的属性volumeProperty->SetColor(colorTransferFunction);//设置颜色volumeProperty->SetScalarOpacity(opacityTransferFunction);//不透明度volumeProperty->ShadeOn();//影阴volumeProperty->SetInterpolationTypeToLinear();//直线与样条插值之间逐发函数volumeProperty->SetAmbient(0.2);//环境光系数volumeProperty->SetDiffuse(0.9);//漫反射volumeProperty->SetSpecular(0.2);//高光系数volumeProperty->SetSpecularPower(10); //高光强度 //定义光线投射方法为MIP体绘制方法,MIP为体绘制经典算法// vtkVolumeRayCastMIPFunction*mipRaycastFunction = vtkVolumeRayCastMIPFunction::New();// mipRaycastFunction->SetMaximizeMethodToOpacity();vtkSmartPointer<vtkVolumeRayCastCompositeFunction> compositeFunction = vtkSmartPointer<vtkVolumeRayCastCompositeFunction>::New();//运行沿着光线合成//定义绘制者vtkVolumeRayCastMapper *volumeMapper = vtkVolumeRayCastMapper::New(); //体绘制器volumeMapper->SetVolumeRayCastFunction(compositeFunction); //载入绘制方法volumeMapper->SetInputConnection(readerImageCast->GetOutputPort());//图像数据输入volumeMapper->SetNumberOfThreads(3);//定义VolumevtkSmartPointer<vtkVolume> volume = vtkSmartPointer<vtkVolume>::New();//表示透示图中的一组三维数据volume->SetMapper(volumeMapper);volume->SetProperty(volumeProperty);//设置体属性ren->AddVolume(volume);//将Volume装载到绘制类中ren->SetBackground(1, 1, 1);renWin->SetSize(600, 600);//设置背景颜色和绘制窗口大小renWin->Render();////窗口进行绘制iren->Initialize();iren->Start();//初始化并进行交互绘制ren->ResetCameraClippingRange();}