VTK 面绘制(升级版)

面绘制的同时进行数据平滑:

问题:在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);    

 

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值