作者:博仔Mmi | 来源:互联网 | 2023-09-14 18:38
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);//装载绘图窗口