vtk读取raw数据的一个例子(体绘制)

cmakelists和上一个例子中的dicom读取大体一致。这里略去。

源代码如下:

该代码来源于网络

#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" void main() { vtkRenderer *ren = vtkRenderer::New();//设置绘制者(绘制对象指针) vtkRenderWindow *renWin = vtkRenderWindow::New();//设置绘制窗口 renWin->AddRenderer(ren);//将绘制者加入绘制窗口 vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();//设置绘制交互操作窗口的 iren->SetRenderWindow(renWin);//将绘制窗口添加到交互窗口 vtkInteractorStyleTrackballCamera *style = vtkInteractorStyleTrackballCamera::New();//交互摄像机 iren->SetInteractorStyle(style);//style为交互模式 //raw 图片 vtkImageReader *reader = vtkImageReader::New(); /* reader->SetFileName("head256.raw"); reader->SetFileDimensionality(3);//设置显示图像的维数 reader->SetDataScalarType(VTK_UNSIGNED_CHAR);//VTK_UNSIGNED_short将数据转换为unsigned char型 reader->SetDataExtent(0,255,0,255,0,224);//图片属性图片像素256x256,最后两参数表示有124张图 reader->SetDataSpacing (0.9,0.9,0.9); //设置像素间间距 reader->SetDataOrigin(0.0, 0.0, 0.0);//设置基准点,(一般没有用)做虚拟切片时可能会用的上 */ /* reader->SetFileName("stent8.raw"); reader->SetFileDimensionality(3);//设置显示图像的维数 reader->SetDataScalarType(VTK_UNSIGNED_CHAR);//VTK_UNSIGNED_short将数据转换为unsigned char型 reader->SetDataExtent(0,511,0,511,0,173);//图片属性图片像素256x256,最后两参数表示有124张图 reader->SetDataSpacing (0.9,0.9,0.9); //设置像素间间距 reader->SetDataOrigin(0.0, 0.0, 0.0);//设置基准点,(一般没有用)做虚拟切片时可能会用的上 */

///* reader->SetFileName("foot.raw"); reader->SetFileDimensionality(3);//设置显示图像的维数 reader->SetDataScalarType(VTK_UNSIGNED_CHAR);//VTK_UNSIGNED_short将数据转换为unsigned char型 reader->SetDataExtent(0,255,0,255,0,255);//图片属性图片像素256x256,最后两参数表示有124张图 reader->SetDataSpacing (0.9,0.9,0.9); //设置像素间间距 reader->SetDataOrigin(0.0, 0.0, 0.0);//设置基准点,(一般没有用)做虚拟切片时可能会用的上 //*/ //读取DICOM数据 /* vtkVolume16Reader *reader=vtkVolume16Reader::New(); reader->SetDataDimensions (64,64);//设置图像像素值 reader->SetImageRange (1,93); //设置图片数量(读取切片的起始端) reader->SetDataByteOrderToLittleEndian();//指明读入字节顺序(可有可无) reader->SetFilePrefix("C:\\Program Files\\VTK 5.4\\vtkdata\\Data\\headsq\\quarter");//设置数据路径 reader->SetDataSpacing (3.2,3.2,1.5); //设置像素间距 reader->SetDataOrigin(0.0, 0.0, 0.0);//设置基准点 */ /* vtkDICOMImageReader *reader = vtkDICOMImageReader::New(); reader->SetDataByteOrderToLittleEndian(); reader->SetDirectoryName("D:\\CT\\dcm\\"); reader->SetDataSpacing(3.2, 3.2, 1.5); reader->SetDataOrigin(0.0, 0.0, 0.0);//设置基准点 */ // BMP图片 /* vtkBMPReader *reader = vtkBMPReader::New(); reader->SetDataExtent(0,175,0,135,1,3);//其中最后一个参数20 就表示我的图像序列有20张图像 reader->SetFilePrefix("D:\\CT\\A"); reader->SetDataSpacing (1, 1, 2);//像素间的间隔 reader->SetDataOrigin(0.0,0.0,0.0); reader->SetAllow8BitBMP (8) ;//很重要设置读入的bmp图片是8位 reader->Allow8BitBMPOff();//标志 */ // PNG图片 /* vtkPNGReader *reader = vtkPNGReader::New(); reader->SetDataByteOrderToLittleEndian(); reader->SetFileName("D:\\CT\\\\png\\fullhead15.png");//一张,多张SetFilePrefix reader->SetDataSpacing(3.2, 3.2, 1.5); reader->SetDataOrigin(0.0,0.0,0.0); */ /* //JPEG图片 vtkJPEGReader *reader = vtkJPEGReader::New(); reader->SetDataByteOrderToLittleEndian(); reader->SetFileDimensionality(3); reader->SetFileName("D:\\CT\\jpg\\masonry-wide.jpg"); reader->SetHeaderSize(0); reader->SetDataSpacing(3.2, 3.2, 1.5); reader->SetDataOrigin(0.0,0.0,0.0); */ vtkImageCast *readerImageCast = vtkImageCast::New();//数据类型转换 readerImageCast->SetInputConnection(reader->GetOutputPort()); readerImageCast->SetOutputScalarTypeToUnsignedShort (); readerImageCast->ClampOverflowOn();//阀值 //reader->Delete(); //设置不透明度传递函数//该函数确定各体绘像素或单位长度值的不透明度 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.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); vtkVolumeProperty *volumeProperty = 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(); vtkVolumeRayCastCompositeFunction *compositeFunction = vtkVolumeRayCastCompositeFunction::New(); //运行沿着光线合成 //定义绘制者 vtkVolumeRayCastMapper *volumeMapper = vtkVolumeRayCastMapper::New(); //体绘制器 volumeMapper->SetVolumeRayCastFunction(compositeFunction); //载入绘制方法 volumeMapper->SetInputConnection(readerImageCast->GetOutputPort());//图像数据输入 volumeMapper->SetNumberOfThreads(3); //定义Volume vtkVolume *volume = vtkVolume::New();//表示透示图中的一组三维数据 volume->SetMapper(volumeMapper); volume->SetProperty(volumeProperty);//设置体属性 //保存 /* vtkVolumeWriter *wSP=vtkVolumeWriter::New(); wSP->SetInputConnection(readerImageCast->GetOutputPort()); wSP->SetFileName("e://ct/mmmm.vtk"); wSP->Write(); wSP->Delete(); */ ren->AddVolume(volume);//将Volume装载到绘制类中 ren->SetBackground(1, 1, 1); renWin->SetSize(600, 600);//设置背景颜色和绘制窗口大小 renWin->Render();////窗口进行绘制 iren->Initialize(); iren->Start();//初始化并进行交互绘制 ren->ResetCameraClippingRange (); volumeMapper->Delete();//释放类存 readerImageCast->Delete(); iren->Delete(); ren->Delete(); renWin->Delete(); opacityTransferFunction->Delete(); volumeProperty->Delete(); compositeFunction->Delete(); volume->Delete(); colorTransferFunction->Delete(); }

效果如下:感觉还有很多问题,暂且放着。

vtk读取raw数据的一个例子(体绘制)_第1张图片


你可能感兴趣的:(vtk读取raw数据的一个例子(体绘制))