1.读取数据
    首先,读取切片数据,并将其转换为我们的开发工具VTK所支持的一种数据表达形式。我们给CT数据建立的是比较抽象的等值面模型,最后将物理组件与抽象的模型结合在一起来建立对CT 数据的可视化,以帮助用户正确理解数据。利用VTK中的vtkDICOMImageReader 我们可以很方便的读取切片数据,读取数据的代码如下所示:

reader =  vtkDICOMImageReader::New();//建立一个读取对象

reader->SetDataByteOrderToLittleEndian();

reader->SetDirectoryName(m_path);  //设置读取切片数据文件的路径

shrink=vtkImageShrink3D::New();//抽取样点,显示数量减少速达加快

shrink->SetShrinkFactors(4,4,1);

shrink->AveragingOn();

shrink->SetInput((vtkDataObject *)reader->GetOutput());

2.提取等值面
    接着我们就可以用算法对所读取的数据进行处理了。本人采用的经典MC的面绘制方法,首先利用vtkMarchingCubes 类来提取出某一CT 值的等值面,但这时的等值面其实仍只是一些三角面片,还必须由vtkStripper 类将其拼接起来形成连续的等值面。这样就把读取的原始数据经过处理转换为应用数据,也即由原始的点阵数据转换为多边形数据然后由vtkPolyDataMapper 将其映射为几何数据,并将其属性赋给窗口中代表它的演员,将结果显示出来。

vtkMarchingCubes *skinExtractor = vtkMarchingCubes::New();

//建立一个Marching Cubes 算法的对象,从CT切片数据中提取出皮肤

skinExtractor->SetValue(0,300); //提取出CT 值为300

skinExtractor->SetInputConnection(shrink->GetOutputPort());

vtkDecimatePro *deci=vtkDecimatePro::New(); //减少数据读取点,以牺牲数据量加速交互

deci->SetTargetReduction(0.3);

deci->SetInputConnection(skinExtractor->GetOutputPort());

vtkSmoothPolyDataFilter *smooth=vtkSmoothPolyDataFilter::New();  //使图像更加光滑

smooth->SetInputConnection(deci->GetOutputPort());

smooth->SetNumberOfIterations(200)  ;

vtkPolyDataNormals * skinNormals = vtkPolyDataNormals::New();  //求法线

skinNormals->SetInputConnection(smooth->GetOutputPort());

skinNormals->SetFeatureAngle(60.0);

vtkStripper *stripper=vtkStripper::New();   //将三角形连接起来

stripper->SetInputConnection(skinNormals->GetOutputPort());

vtkPolyDataMapper *skinMapper = vtkPolyDataMapper::New();  //将几何数据映射成图像数据

skinMapper->SetInput(stripper->GetOutput());

skinMapper->ScalarVisibilityOff();

利用同样的方法,我们也可以提取出骨骼的等值面。骨骼的CT 值是1150 左右。所以只要在SetValue()方法中将参数设置为1150 就可以了。而且Visualization Toolkit支持多表面重建,所以在实际应用中我们可以设置多个参数值,提取出多个等值面并同时显示出来。在这个应用实例中我们只对血管等值面进行了重建。
    3. 显示及结果
     通过前面这些工作,我们基本上已经完成了对数据的读取处理映射等步骤,下面我们就要对数据进行显示了。

//设置照相机

aCamera = vtkCamera::New();

aCamera->SetViewUp (0, 0, -1);

aCamera->SetPosition (0, 1, 0);

aCamera->SetFocalPoint (0, 0, 0);

aCamera->ComputeViewPlaneNormal();

//设置Actor相关系数

coneActor = vtkActor::New();

coneActor->SetMapper(skinMapper);

coneActor->GetProperty()->SetAmbient(0.5);

coneActor->GetProperty()->SetDiffuse(1);

coneActor->GetProperty()->SetSpecular(0.6);

//显示类

renderer = vtkRenderer::New();

renderer->AddActor(coneActor);//添加coneActor对象

renderer->AddActor2D(textActor);//添加textActor对象

renderer->SetBackground(0,0,0);

renderer->SetActiveCamera(aCamera);//添加照相机

renderer->ResetCamera ();

renWin = vtkRenderWindow::New();//设置绘图窗口renWin->AddRenderer(renderer);//装载绘图类

iren = vtkWin32RenderWindowInteractor::New();//设置绘图窗口交互

iren->SetRenderWindow(renWin);//装载绘图窗口

用VTK实现CT图片的三维重建过程相关推荐

  1. ICCV 2021 | 字节跳动利用单幅图片做三维重建!将NeRF、MPI结合,提出MINE新工作...

    转载自:机器之心 |  字节跳动视觉技术团队 来自字节跳动视觉技术团队的研究者将 NeRF 和 Multiplane Image(MPI)结合,提出了一种新的三维空间表达方式 MINE.该方法通过对单 ...

  2. 现代计算机三大科学计算,基于三维重建过程中纹理映射问题的研究

    基于三维重建过程中纹理映射问题的研究 科学计算可视化.计算机动画和虚拟现实已经成为计算机图形学的三大热门话题,这三大话题的技术核心均为三维图形.学术界和产业界普遍认为,纹理映射是解决真实地显示现实世界 ...

  3. matlab 画图 断层显示,MATLAB编程实现连续断层工业CT图像的三维重建_张爱东

    第26卷 第4期核电子学与探测技术 V ol.26 N o.4 2006年 7月Nuclear Electr onics &Detection T echnolo gy July 2006 M ...

  4. VTK重建CT图像,写入和读取STL格式文件

    VTK重建CT图像(代码亲测无误) 1.读取数据 2.提取等值面 3.显示结果 一是要有输入源(jpegreader读入的数据) 二是要有相机(camera) 三是要有展示的窗口(window) #i ...

  5. 人脸三维重建 ct图像的三维重建系统

    在下面展示了三维重建系统的基本放啊 将人脸筋进行三维重建的结果 可以看出有一点人脸的迹象 代码 人脸三维重建ct图像的三维重建系统-机器学习文档类资源-CSDN文库

  6. CT图片分类神经网络

    CT图片分类 链接:https://pan.baidu.com/s/15CxZVg_3L466hkpgeQ7-VA 提取码:dwck ct图片的链接 from PIL import Image#图像进 ...

  7. VTK显示CT图像视图

    VTK显示CT图像视图

  8. python给pdf加图片签名_Python生成个性签名图片获取GUI过程解析

    这篇文章主要介绍了Python生成个性签名图片获取GUI过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 先来看看程序运行的样子: 所以,程序 ...

  9. ps去掉图片白色背景的过程

    2019独角兽企业重金招聘Python工程师标准>>> 记一下去图片白色背景的过程:   打开gif 先把图形变成RGB模式 Image->Mode->RGB color ...

最新文章

  1. tensorflow学习笔记(二十五):ConfigProtoGPU
  2. 把我坑惨的一个update语句!
  3. r语言和python-R语言和Python —— 一个
  4. linux 进程内存解析
  5. python连接高斯数据库_Python加载数据并执行多高斯fi
  6. Linux带给了我什么?
  7. Nat Commun|单细胞ATAC-seq深度学习工具包AtacWorks,简单、高效且适用
  8. 2019升职加薪必备:你一定要修炼的产品思维
  9. P2Psim分析笔记(5)-EventGenerator and Observer
  10. CCF202012-2 期末预测之最优阈值
  11. U盘安装CentOS系统
  12. 服务器异常的处理方式
  13. 【Visual C++】游戏开发笔记四十七 浅墨DirectX教程十五 翱翔于三维世界 摄像机的实现
  14. QQ第三方登录的应用
  15. 例子打卡第二天(12-16)
  16. DYNAMIC MOVEMENT PRIMITIVES PART 1: THE BASICS
  17. mysql中的临时表怎么用的?
  18. 网桥工作原理及题目分析
  19. 2. ThingsBoard 源码调试
  20. vive定位器突然闪红灯

热门文章

  1. unity 可滚动文本_Unity3d如何实现滚动文本框?
  2. 总线制和多线制示意图_知识||RS485简介及与其他总线网络的区别
  3. 安卓端和服务器端通信协议,安卓客户端和服务器如何通信协议
  4. 编写程序判断等腰、等边或者普通三角形
  5. java夯实基础:final脑图
  6. Laravel核心代码学习 -- Facades
  7. 如何成为一名优秀的软件架构师?
  8. 软件安装——internal error2503/2502
  9. Java基础班学习笔记(8)
  10. 记录EasyUI使用中的问题和解决的方法