用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);//装载绘图窗口

  • 9
    点赞
  • 102
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
【资源介绍】 基于Qt和VTK实现CT三维重建项目c++源码+项目说明.zip 该项目是个人毕设项目,答辩评审分达到95分,代码都经过调试测试,确保可以运行!欢迎下载使用,可用于小白学习、进阶。 该资源主要针对计算机、通信、人工智能、自动化等相关专业的学生、老师或从业者下载使用,亦可作为期末课程设计、课程大作业、毕业设计等。 项目整体具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现不同的功能。 项目进度记录 1、解决了内存问题 2、从切片上拾取点并计算在三维空间中的坐标 3、三维点标记 4、三维空间点的增删,设计测量模式的UI 5、添加了表格的数据增删 6、调试二次加载的BUG(添加重置功能) 7、裁剪功能的图像导入与滑条索引 8、优化:测量数据不可编辑 9、路径编码问题 10、实现裁剪功能(需要OpenCV) 11、增加导出裁剪图像时显示进度条的功能,由于VTK图像读取在内部完成,实现进度条功能相对复杂,暂未实现。 12、裸数据(二进制)裁剪 13、三维切面默认不显示 14、背景默认为黑色 15、bin文件读取增加自动读取config文件,确定宽高参数 16、裁剪后可直接读入到三维体绘制中,仍保留裁剪后保存的功能 17、三维体绘制的切面改为半透明 18、经测试,裁剪后读入(内存读入)出现了内存泄漏的问题,获取每一层的指针,解决了这个问题 19、解决进度条出现了假死的情况 20、解决选择文件夹为空的崩溃问题 21、实现对话框裁剪序列图像 22、在MainWindow中声明CropSequenceDialog为友元类,CropSequenceDialog则可以直接访问MainWindow的成员(包括私有)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值