面绘制的同时进行数据平滑:
问题:在3D绘制时通过算法得到的数据面绘制后出现阶梯效应,这就对数据后续观察和操作造成影响。
比如我们得到的血管图像一般都不是平滑的,因此在重建时需要加上下面的代码:
0、数据读取
1、降采样,加速(如果降采样后影响结果,这一步可不加)
2、MC算法重建
3、减少数据点,加速
4、平滑、求法线、提取等值面
OK,显示出来就好了
备注:这里我想重点解释下这里为什么设置 setvalue( 0 , 1 ) ;
原因:在之前的处理过程中我们已经将结果二值化为0和255(一定是255,而不是1,如果你取的是1的话,我后面说的就不成立了),那么按道理来说,这里应该设置 SetValue(0 , 255) 得到等值面,也是对的,但是因为我们得到的结果是有阶梯效应的,单单凭借VTK的平滑函数是达不到很好效果,因此这里我们取结果的轮廓,也就是将SetValue(0 , 1)得到的就是结果的轮廓。
再多说一句,如果你二值化的结果是0和1,那么你SetValue(0 , 1)得到的结果依然有阶梯效应,且它不是轮廓!!
vtkSmartPointer<vtkImageShrink3D> shrink = vtkImageShrink3D::New();//抽取样点,显示数量减少速达加快
shrink->SetShrinkFactors(2,2,1);//可以改
shrink->AveragingOn();
shrink->SetInputData((vtkDataObject *)Reader->GetOutput());
//用Marching Cubes 算法
vtkSmartPointer<vtkMarchingCubes> vesselExtractor = vtkMarchingCubes::New(); //建立一个Marching Cubes 算法的对象
vesselExtractor->SetInputConnection(shrink->GetOutputPort());
vesselExtractor->SetNumberOfContours(10);
vesselExtractor->SetValue( 0 , 1);
vtkSmartPointer<vtkDecimatePro> deci=vtkDecimatePro::New(); //减少数据读取点,以牺牲数据量加速交互
deci->SetTargetReduction(0.3);
deci->SetInputConnection(vesselExtractor->GetOutputPort());
vtkSmartPointer<vtkSmoothPolyDataFilter> smooth=vtkSmoothPolyDataFilter::New(); //使图像更加光滑
smooth->SetInputConnection(deci->GetOutputPort());
smooth->SetNumberOfIterations(200) ; //迭代次数
//求法线
vtkSmartPointer<vtkPolyDataNormals> skinNormals = vtkPolyDataNormals::New();
skinNormals->SetInputConnection(smooth->GetOutputPort());
skinNormals->SetFeatureAngle(180);//
//将提取的等值面拼接成连续的
vtkSmartPointer<vtkStripper> vesselStripper = vtkStripper::New();
vesselStripper->SetInputConnection(skinNormals->GetOutputPort());
//映成集合数据,将其属性赋给窗口中代表它的演员,将结果显示出来。
vtkSmartPointer<vtkPolyDataMapper> vesselMapper = vtkPolyDataMapper::New();
vesselMapper->SetInputConnection(vesselStripper->GetOutputPort());
vesselMapper->SetScalarRange(0,7);
vtkSmartPointer<vtkActor> actor = vtkActor::New();
actor->SetMapper(vesselMapper);
actor->GetProperty()->SetColor(0,0,1);