用VTK实现CT图片的三维重建过程

来源:互联网 发布:淘宝达人 自媒体 认证 编辑:程序博客网 时间:2024/05/21 12:44

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

原创粉丝点击