资讯详情

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用于等值线提取实验

资源下载地址:https://github.com/pyvista/vtk-data/tree/master/Data 将.mhd文件和.raw文件放在同一个文件夹中。

#include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL2); VTK_MODULE_INIT(vtkRenderingFreeType); VTK_MODULE_INIT(vtkInteractionStyle);  #include <vtkSmartPointer.h> #include <vtkMetaImageReader.h> #include <vtkImageData.h> #include <vtkMarchingCubes.h> #include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkProperty.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkInteractorStyleImage.h> #include <vtkVoxelModeller.h> int main() { 
          vtkSmartPointer<vtkMetaImageReader> reader = vtkSmartPointer<vtkMetaImageReader>::New(); reader->SetFileName("data/HeadMRVolume.mhd"); reader->Update(); vtkSmartPointer<vtkMarchingCubes> surface = vtkSmartPointer<vtkMarchingCubes>::New(); surface->SetInputData(reader->GetOutput()); surface->ComputeNormalsOn(); surface->SetValue(0, 100); //第0个等值面 值为:100 surface->Update(); //surface->GenerateValues(0, 150, 200); /// vtkSmartPointer<vtkPolyDataMapper> surfMapper = vtkSmartPointer<vtkPolyDataMapper>::New(); surfMapper->SetInputConnection(surface->GetOutputPort()); vtkSmartPointer<vtkActor> surfActor = vtkSmartPointer<vtkActor>::New(); surfActor->SetMapper(surfMapper); surfActor->GetProperty()->SetColor(1, 0, 0); vtkSmartPointer<vtkRenderer> surfRender = vtkSmartPointer<vtkRenderer>::New(); surfRender->AddActor(surfActor); surfRender->SetBackground(0, 0, 0); vtkSmartPointer<vtkRenderWindow> rw = vtkSmartPointer<vtkRenderWindow>::New(); rw->AddRenderer(surfRender); rw->SetSize(640, 480); rw->SetWindowName("PolyData MarchingCubes"); rw->Render(); vtkSmartPointer<vtkRenderWindowInteractor> rwi = vtkSmartPointer<vtkRenderWindowInteractor>::New(); vtkSmartPointer<vtkInteractorStyleImage> style = vtkSmartPointer<vtkInteractorStyleImage>::New(); rwi->SetInteractorStyle(style); rwi->SetRenderWindow(rw); rwi->Initialize(); rwi->Start(); return 0; } 

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

void GenerateValues(int numContours,double range[2]);
void GenerateValues(int numContours, double rangStart, double rangeEnd);

标签: rwi电阻br4x121rok

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台