VTK 表面重建-等值面提取

来源:互联网 发布:淘宝买东西有限额吗 编辑:程序博客网 时间:2024/05/16 07:59

等值面提取

等值面(线)提取是一种常用的可视化技术,常应用与医学、地质、气象学等领域,例如,在医学图像处理中,由于CT、MRI等图像分辨率越来越高,虽然体绘制可以清晰地对数据结构进行可视化,但是其计算量和效率却制约了其使用。此时可以通过等值面提取技术,仅提取感兴趣的一个或几个组织轮廓,并生成网格模型以供后续的处理和显示。

这里写图片描述

VTK中的等值面提取算法多基于Marching Cubes算法来实现。MarchingCubes是经典的移动立方体等值面提取算法,等值面提取类根据数据类型的不同而有所侧重。vtkImageMarchingCubes主要处理三维图像数据;vtkMarchingCubes主要是针对规则体数据生成等值面;vtkMarchingSquares则是针对二维规则网格数据生成等值线。

首先通过一个reader对象读取一副图片,并将其输入到vtkMarchingCubes中,提取等值面时,最重要的操作是设置等值面的数值,SetValue()函数用于设置等值面的值,其第一个参数表示等值面的序号,因此可以通过此函数设置多个等值面数值来提取多个等值面。

#include"vtkSmartPointer.h"#include"vtkRenderer.h"#include"vtkRenderWindow.h"#include"vtkActor.h"#include"vtkPolyData.h"#include"vtkPolyDataMapper.h"#include"vtkImageReader.h"#include"vtkMarchingCubes.h"#include"vtkProperty.h"#include"vtkRenderWindowInteractor.h"#include"vtkVoxelModeller.h"#include"vtkInteractorStyle.h"#include"vtkAutoInit.h"#include"vtkMetaImageReader.h"VTK_MODULE_INIT(vtkRenderingOpenGL);VTK_MODULE_INIT(vtkRenderingFreeType);VTK_MODULE_INIT(vtkInteractionStyle);int main(){    std::string str = "HeadMRVolume.mhd";    vtkSmartPointer<vtkMetaImageReader> reader = vtkSmartPointer<vtkMetaImageReader>::New();    reader->SetFileName(str.c_str());    reader->Update();    vtkSmartPointer<vtkMarchingCubes> surface = vtkSmartPointer<vtkMarchingCubes>::New();    surface->SetInputConnection(reader->GetOutputPort());    surface->ComputeNormalsOn();    surface->SetValue(0, 200);    surface->Update();    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();    mapper->SetInputConnection(surface->GetOutputPort());    mapper->Update();    vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();    actor->SetMapper(mapper);    actor->GetProperty()->SetColor(1,0,0);    vtkSmartPointer<vtkRenderer> ren = vtkSmartPointer<vtkRenderer>::New();    ren->AddActor(actor);    vtkSmartPointer<vtkRenderWindow> renwin = vtkSmartPointer<vtkRenderWindow>::New();    renwin->AddRenderer(ren);    renwin->SetSize(740, 480);    renwin->SetWindowName("Set_Value");    renwin->Render();    vtkSmartPointer<vtkRenderWindowInteractor> iren = vtkSmartPointer<vtkRenderWindowInteractor>::New();    iren->SetRenderWindow(renwin);    iren->Initialize();    iren->Start();    return EXIT_SUCCESS;}

运行结果如下图

这里写图片描述

这里写图片描述

阅读全文
1 0