用VTK实现CT图片的三维重建过程
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图片的三维重建过程相关推荐
- ICCV 2021 | 字节跳动利用单幅图片做三维重建!将NeRF、MPI结合,提出MINE新工作...
转载自:机器之心 | 字节跳动视觉技术团队 来自字节跳动视觉技术团队的研究者将 NeRF 和 Multiplane Image(MPI)结合,提出了一种新的三维空间表达方式 MINE.该方法通过对单 ...
- 现代计算机三大科学计算,基于三维重建过程中纹理映射问题的研究
基于三维重建过程中纹理映射问题的研究 科学计算可视化.计算机动画和虚拟现实已经成为计算机图形学的三大热门话题,这三大话题的技术核心均为三维图形.学术界和产业界普遍认为,纹理映射是解决真实地显示现实世界 ...
- matlab 画图 断层显示,MATLAB编程实现连续断层工业CT图像的三维重建_张爱东
第26卷 第4期核电子学与探测技术 V ol.26 N o.4 2006年 7月Nuclear Electr onics &Detection T echnolo gy July 2006 M ...
- VTK重建CT图像,写入和读取STL格式文件
VTK重建CT图像(代码亲测无误) 1.读取数据 2.提取等值面 3.显示结果 一是要有输入源(jpegreader读入的数据) 二是要有相机(camera) 三是要有展示的窗口(window) #i ...
- 人脸三维重建 ct图像的三维重建系统
在下面展示了三维重建系统的基本放啊 将人脸筋进行三维重建的结果 可以看出有一点人脸的迹象 代码 人脸三维重建ct图像的三维重建系统-机器学习文档类资源-CSDN文库
- CT图片分类神经网络
CT图片分类 链接:https://pan.baidu.com/s/15CxZVg_3L466hkpgeQ7-VA 提取码:dwck ct图片的链接 from PIL import Image#图像进 ...
- VTK显示CT图像视图
VTK显示CT图像视图
- python给pdf加图片签名_Python生成个性签名图片获取GUI过程解析
这篇文章主要介绍了Python生成个性签名图片获取GUI过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 先来看看程序运行的样子: 所以,程序 ...
- ps去掉图片白色背景的过程
2019独角兽企业重金招聘Python工程师标准>>> 记一下去图片白色背景的过程: 打开gif 先把图形变成RGB模式 Image->Mode->RGB color ...
最新文章
- tensorflow学习笔记(二十五):ConfigProtoGPU
- 把我坑惨的一个update语句!
- r语言和python-R语言和Python —— 一个
- linux 进程内存解析
- python连接高斯数据库_Python加载数据并执行多高斯fi
- Linux带给了我什么?
- Nat Commun|单细胞ATAC-seq深度学习工具包AtacWorks,简单、高效且适用
- 2019升职加薪必备:你一定要修炼的产品思维
- P2Psim分析笔记(5)-EventGenerator and Observer
- CCF202012-2 期末预测之最优阈值
- U盘安装CentOS系统
- 服务器异常的处理方式
- 【Visual C++】游戏开发笔记四十七 浅墨DirectX教程十五 翱翔于三维世界 摄像机的实现
- QQ第三方登录的应用
- 例子打卡第二天(12-16)
- DYNAMIC MOVEMENT PRIMITIVES PART 1: THE BASICS
- mysql中的临时表怎么用的?
- 网桥工作原理及题目分析
- 2. ThingsBoard 源码调试
- vive定位器突然闪红灯