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);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

简 。单

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值