VTK读取DICOM医学图片进行体绘制的几种方法
来源:互联网 发布:最经典的算法书籍 编辑:程序博客网 时间:2024/06/08 06:05
注意的是:VTK中不同的vtkVolumeMapper支持不同的数据类型。比如vtkVolumeRayCastMapper和vtkVolumeTextureMapper2D只能支持单分组VTK_UNSIGNED_CHAR和VTK_UNSIGNED_SHORT类型数据,因此当读入其他类型的图像数据时,需要对数据进行转换,比如采用vtkImageCast或者vtkImageScale:而vtkVolumeTextMapper3D则支持任意数据类型,但是必须是单分组数据或者多元独立数据。vtkFixedPointVolumeRayCastMapper灵活性最高,可以支持所有类型数据,最高四元数据。
使用vtkFixedPointVolumeRayCastMapper类
#include "vtkRenderer.h" #include "vtkRenderWindow.h" #include "vtkRenderWindowInteractor.h" #include "vtkActor.h" #include "vtkSmartPointer.h" #include "vtkProperty.h" #include "vtkCamera.h" #include "vtkDICOMImageReader.h" #include "vtkImageCast.h" #include "vtkPiecewiseFunction.h" #include "vtkColorTransferFunction.h" #include "vtkVolumeProperty.h" #include "vtkVolumeRayCastCompositeFunction.h" #include "vtkVolumeRayCastMapper.h" #include "vtkVolume.h" #include "vtkAutoInit.h"#include "vtkFixedPointVolumeRayCastMapper.h"VTK_MODULE_INIT(vtkRenderingOpenGL);VTK_MODULE_INIT(vtkInteractionStyle);VTK_MODULE_INIT(vtkRenderingFreeType);VTK_MODULE_INIT(vtkRenderingVolumeOpenGL);int main(){ std::string str = "F:\\CT3"; vtkSmartPointer<vtkDICOMImageReader> reader = vtkSmartPointer<vtkDICOMImageReader>::New(); reader->SetDirectoryName(str.c_str()); reader->Update(); vtkSmartPointer<vtkPiecewiseFunction> opacityFun = vtkSmartPointer<vtkPiecewiseFunction>::New(); opacityFun->AddPoint(120,0.0); opacityFun->AddPoint(250,1.0); opacityFun->AddPoint(520,1.0); opacityFun->AddPoint(650,0.0); vtkSmartPointer<vtkColorTransferFunction> TransferFun = vtkSmartPointer<vtkColorTransferFunction>::New(); TransferFun->AddRGBPoint(120, 255 / 255.0, 98 / 255.0, 98 / 255.0); TransferFun->AddRGBPoint(250, 255 / 255.0, 255 / 255.0, 180 / 255.0); TransferFun->AddRGBPoint(520, 1.0, 1.0, 1.0); TransferFun->AddRGBPoint(650, 1.0, 1.0, 1.0); vtkSmartPointer<vtkPiecewiseFunction> grideFun = vtkSmartPointer<vtkPiecewiseFunction>::New(); grideFun->AddPoint(120, 2.0); grideFun->AddPoint(250, 2.0); grideFun->AddPoint(520, 0.1); grideFun->AddPoint(650, 0.1); vtkSmartPointer<vtkVolumeProperty> volumeProperty = vtkSmartPointer<vtkVolumeProperty>::New(); volumeProperty->SetColor(TransferFun); volumeProperty->SetScalarOpacity(opacityFun); volumeProperty->SetGradientOpacity(grideFun); volumeProperty->ShadeOn(); volumeProperty->SetAmbient(0.2); volumeProperty->SetDiffuse(0.9); volumeProperty->SetSpecular(0.2); volumeProperty->SetSpecularPower(10); vtkSmartPointer<vtkVolumeRayCastCompositeFunction> rayCastFun = vtkSmartPointer<vtkVolumeRayCastCompositeFunction>::New(); vtkSmartPointer<vtkFixedPointVolumeRayCastMapper> mapper1 = vtkSmartPointer<vtkFixedPointVolumeRayCastMapper>::New(); mapper1->SetInputConnection(reader->GetOutputPort()); mapper1->SetAutoAdjustSampleDistances(0); vtkSmartPointer<vtkVolume> volume = vtkSmartPointer<vtkVolume>::New(); volume->SetMapper(mapper1); volume->SetProperty(volumeProperty); vtkSmartPointer<vtkRenderer> ren = vtkSmartPointer<vtkRenderer>::New(); ren->AddVolume(volume); ren->SetBackground(1.0,1.0,1.0); vtkSmartPointer<vtkRenderWindow> renwin = vtkSmartPointer<vtkRenderWindow>::New(); renwin->AddRenderer(ren); renwin->SetSize(740, 480); vtkSmartPointer<vtkRenderWindowInteractor> iren = vtkSmartPointer<vtkRenderWindowInteractor>::New(); iren->SetRenderWindow(renwin); iren->Initialize(); renwin->Render(); iren->Start(); return 0;}
使用tkVolumeRayCastCompositeFunction类
#include "vtkRenderer.h" #include "vtkRenderWindow.h" #include "vtkRenderWindowInteractor.h" #include "vtkActor.h" #include "vtkSmartPointer.h" #include "vtkProperty.h" #include "vtkCamera.h" #include "vtkDICOMImageReader.h" #include "vtkImageCast.h" #include "vtkPiecewiseFunction.h" #include "vtkColorTransferFunction.h" #include "vtkVolumeProperty.h" #include "vtkVolumeRayCastCompositeFunction.h" #include "vtkVolumeRayCastMapper.h" #include "vtkVolume.h" #include "vtkAutoInit.h"VTK_MODULE_INIT(vtkRenderingOpenGL);VTK_MODULE_INIT(vtkInteractionStyle);VTK_MODULE_INIT(vtkRenderingFreeType);VTK_MODULE_INIT(vtkRenderingVolumeOpenGL);int main(){ std::string str = "F:\\CT3"; vtkSmartPointer<vtkDICOMImageReader> reader = vtkSmartPointer<vtkDICOMImageReader>::New(); reader->SetDirectoryName(str.c_str()); reader->SetDataByteOrderToLittleEndian();// 小端字节序 reader->Update(); vtkSmartPointer<vtkImageCast> imageCast = vtkSmartPointer<vtkImageCast>::New(); imageCast->SetInputConnection(reader->GetOutputPort()); imageCast->SetOutputScalarTypeToUnsignedShort(); imageCast->Update(); vtkSmartPointer<vtkPiecewiseFunction> opacityFun = vtkSmartPointer<vtkPiecewiseFunction>::New(); opacityFun->AddPoint(120,0.0); opacityFun->AddPoint(250,1.0); opacityFun->AddPoint(520,1.0); opacityFun->AddPoint(650,0.0); vtkSmartPointer<vtkColorTransferFunction> TransferFun = vtkSmartPointer<vtkColorTransferFunction>::New(); TransferFun->AddRGBPoint(120, 255 / 255.0, 98 / 255.0, 98 / 255.0); TransferFun->AddRGBPoint(250, 255 / 255.0, 255 / 255.0, 180 / 255.0); TransferFun->AddRGBPoint(520, 1.0, 1.0, 1.0); TransferFun->AddRGBPoint(650, 1.0, 1.0, 1.0); vtkSmartPointer<vtkPiecewiseFunction> grideFun = vtkSmartPointer<vtkPiecewiseFunction>::New(); grideFun->AddPoint(120, 2.0); grideFun->AddPoint(250, 2.0); grideFun->AddPoint(520, 0.1); grideFun->AddPoint(650, 0.1); vtkSmartPointer<vtkVolumeProperty> volumeProperty = vtkSmartPointer<vtkVolumeProperty>::New(); volumeProperty->SetColor(TransferFun); volumeProperty->SetScalarOpacity(opacityFun); volumeProperty->SetGradientOpacity(grideFun); volumeProperty->ShadeOn(); volumeProperty->SetAmbient(0.2); volumeProperty->SetDiffuse(0.9); volumeProperty->SetSpecular(0.2); volumeProperty->SetSpecularPower(10); vtkSmartPointer<vtkVolumeRayCastCompositeFunction> rayCastFun = vtkSmartPointer<vtkVolumeRayCastCompositeFunction>::New(); vtkSmartPointer<vtkVolumeRayCastMapper> mapper1 = vtkSmartPointer<vtkVolumeRayCastMapper>::New(); mapper1->SetVolumeRayCastFunction(rayCastFun); mapper1->SetInputConnection(imageCast->GetOutputPort()); mapper1->SetAutoAdjustSampleDistances(0); vtkSmartPointer<vtkVolume> volume = vtkSmartPointer<vtkVolume>::New(); volume->SetMapper(mapper1); volume->SetProperty(volumeProperty); vtkSmartPointer<vtkRenderer> ren = vtkSmartPointer<vtkRenderer>::New(); ren->AddVolume(volume); ren->SetBackground(1.0,1.0,1.0); vtkSmartPointer<vtkRenderWindow> renwin = vtkSmartPointer<vtkRenderWindow>::New(); renwin->AddRenderer(ren); renwin->SetSize(740, 480); vtkSmartPointer<vtkRenderWindowInteractor> iren = vtkSmartPointer<vtkRenderWindowInteractor>::New(); iren->SetRenderWindow(renwin); iren->Initialize(); renwin->Render(); iren->Start(); return 0;}
使用vtkPiecewiseFunction 设置不透明度和梯度不透明vtkTransferFunctiony设置颜色传输。
阅读全文
3 0
- VTK读取DICOM医学图片进行体绘制的几种方法
- vtk读取序列医学Dicom图片进行体绘制(vtkVolumeRayCastCompositeFunction类)
- VTK读取序列的Dicom医学图片,用Marchingcube进行重建,并保存为obj文件
- 使用vtk面绘制dicom医学断层图像
- VTK:读入DICOM,体绘制
- VTK:读取raw图片格式进行体绘制
- DICOM医学图像读取涉及到的医学坐标体系
- ITK/VTK对DICOM文件的读取
- vtk读取文件并显示的几种方法
- VTK读取DICOM图像
- VTK:读取raw文件进行面绘制
- VTK实现Dicom文件的读取及显示
- 【Python】读取图片的几种方法
- vtk读取raw数据的一个例子(体绘制)
- 医学图像DICOM处理-VTK+Qt+VS开发环境搭建
- 如何加快VTK进行体绘制的速度
- VTK中的体绘制方法
- 【VTK】三维体绘制方法
- unity和安卓通信_调用相册_AndroidStudio
- 欢迎使用CSDN-markdown编辑器
- 菜鸟学习历程【15-1】直接插入排序
- 【现代密码学】用MATLAB实现RC4算法
- View 的一些方法 《未完》
- VTK读取DICOM医学图片进行体绘制的几种方法
- Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException
- 过滤器和拦截器的本质区别
- jquery ul li 操作
- SpringBoot 统一异常处理--- @ControllerAdvice 使用
- 使用PHPStorm+Composer快速初始化项目
- 为Apk打上系统签名
- Eclipse与GitHub的整合(一)——本地Git仓库中的代码push至GitHub
- Android Surface理解