• VTK 图形基本操作进阶_表面重建技术(等值面提取)


    1.等值面提取

    等值面(线)提取是一种常用的可视化技术,常应用于医学、地质、气象等领域。例如,在医学图像处理中,由于CT、MRI等图像分辨率越来越高,虽然体绘制技术可以清晰地对数据内部结构进行可视化,但是其计算量和效率却制约了其使用。此时可通过等值面提取技术,仅提取感兴趣的一个或者几个组织轮廓,并生成网格模型以供后续的处理和研究。
    根据数据类型的不同,VTK中提供了多个等值面提取类,其类图如图所示:
     
    VTK中的等值面提取算法多基于MarchingCube算法来实现。MarchingCube是经典的移动立方体等值面提取算法。该算法是由W.E.Lorenson和H.E.Cline在1987年提出的。由于这一方法原理简单,易于实现,目前已经得到了较为广泛的应用,称为三维数据等值面生成的经典算法。等值面提取类根据数据类型的不同而有所侧重。
    • vtkImageMarchingCubes:主要处理三维图像数据
    • vtkMarchingCubes:主要针对规则体数据生成等值面
    • vtkMarchingSquares:则是针对二维规则网格数据生成等值线
    • vtkMarchingContourFilter:可以接受任何类型的数据,其内部根据数据不同生成不同的算法对象实现等值面/线的提取,具有较高的效率
    • vtkContourFilter:则是一个更加通用的等值面提取类,其可以接受任意的数据类型生成等值线或等值面。
    vtkDiscreteMarchingCubes继承自vtkMarchingCubes,主要针对Label图像,比如利用图像分割算法对医学图像进行分割后得到含有不同Label值得数据,每个Label对应一个组织,吐过想要得到其中一个或者几个组织的洛括模型,则可以考虑使用该类。

    2.vtkMarchingCubes用于等值线提取实验

    上面的几个类的使用方法基本一致,下面仅以vtkMarchingCubes为例来演示提取图像数据等值面的效果:
     1 #include <vtkAutoInit.h>
     2 VTK_MODULE_INIT(vtkRenderingOpenGL);
     3 VTK_MODULE_INIT(vtkRenderingFreeType);
     4 VTK_MODULE_INIT(vtkInteractionStyle);
     5  
     6 #include <vtkSmartPointer.h>
     7 #include <vtkMetaImageReader.h>
     8 #include <vtkImageData.h>
     9 #include <vtkMarchingCubes.h>
    10 #include <vtkPolyDataMapper.h>
    11 #include <vtkActor.h>
    12 #include <vtkProperty.h>
    13 #include <vtkRenderer.h>
    14 #include <vtkRenderWindow.h>
    15 #include <vtkRenderWindowInteractor.h>
    16 #include <vtkInteractorStyleImage.h>
    17 #include <vtkVoxelModeller.h>
    18 int main()
    19 {
    20     vtkSmartPointer<vtkMetaImageReader> reader =
    21         vtkSmartPointer<vtkMetaImageReader>::New();
    22     reader->SetFileName("HeadMRVolume.mhd");
    23     reader->Update();
    24  
    25     vtkSmartPointer<vtkMarchingCubes> surface =
    26         vtkSmartPointer<vtkMarchingCubes>::New();
    27     surface->SetInputData(reader->GetOutput());
    28     surface->ComputeNormalsOn();
    29     surface->SetValue(0, 100);  //第0个等值面  值为:200
    30     surface->Update();
    31     //surface->GenerateValues(0, 150, 200);
    32     ///
    33     vtkSmartPointer<vtkPolyDataMapper> surfMapper =
    34         vtkSmartPointer<vtkPolyDataMapper>::New();
    35     surfMapper->SetInputConnection(surface->GetOutputPort());
    36     vtkSmartPointer<vtkActor> surfActor =
    37         vtkSmartPointer<vtkActor>::New();
    38     surfActor->SetMapper(surfMapper);
    39     surfActor->GetProperty()->SetColor(1, 0, 0);
    40     
    41     vtkSmartPointer<vtkRenderer> surfRender =
    42         vtkSmartPointer<vtkRenderer>::New();
    43     surfRender->AddActor(surfActor);
    44     surfRender->SetBackground(0, 0, 0);
    45  
    46     vtkSmartPointer<vtkRenderWindow> rw =
    47         vtkSmartPointer<vtkRenderWindow>::New();
    48     rw->AddRenderer(surfRender);
    49     rw->SetSize(640, 480);
    50     rw->SetWindowName("PolyData MarchingCubes");
    51     rw->Render();
    52  
    53     vtkSmartPointer<vtkRenderWindowInteractor> rwi =
    54         vtkSmartPointer<vtkRenderWindowInteractor>::New();
    55     vtkSmartPointer<vtkInteractorStyleImage> style =
    56         vtkSmartPointer<vtkInteractorStyleImage>::New();
    57     rwi->SetInteractorStyle(style);
    58     rwi->SetRenderWindow(rw);
    59     rwi->Initialize();
    60     rwi->Start();
    61  
    62     return 0;
    63 }
    首先通过一个reader对象来读取一幅图像,并将输入到vtkMarchingCubes中,提取等值面时,最重要的是要设置等值面的数值,SetValue()函数用于设置等值面的值,其第一个参数表示等值面的序号,因此可以通过这个函数设置多个等值面值来提取多个等值面。另外我们也可以通过GenerateValues提取多个等值面。
    1 void GenerateValues(int numContours,double range[2]);
    2 void GenerateValues(int numContours, double rangStart, double rangeEnd);
    其中,numContour为生成等值面的个数,range表示获取等势面数值的范围。
    其实,这里面还有一个求取法向量的过程,我们可能会感到比较奇怪??!
    通过前面分析的内容,我们知道,法向量可以提高渲染质量 。

    3. cannot convert parameter 1 from 'vtkImageData *' to 'vtkDataObject *'

    在vtkuser里看到有人提问了。
    解决方法很简单:
    增加头文件:
    #include "vtkImageData.h"即可

    4.一直以来未解决的问题

    貌似一直以来除了我,没有人遇到过啊???其实在32bit平台上也没有遇到过。。。继续吧。。。
  • 相关阅读:
    protobuf 文档
    nodesass安装出错问题
    idea 部署docker
    cnpm报错 : 无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\cnpm.ps1,因为在此系统上禁止运行脚本
    开源镜像下载
    工具—idea
    Java 17 java.util.HashSet 类源码分析
    IDEA 使用@Autowired提示Field injection is not recommended
    6 MyBatis动态SQL之choose(when、otherwise)语句
    Java Set的五种遍历方式
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/14241922.html
Copyright © 2020-2023  润新知