Marching Cubes

MarchingCubes建模是三维可视化库VTK建模算法之一。该建模方法采用空间分解的方法,对空间体元进行不断的切割处理,最后得到一个由规则体构成的非规则复杂物体的近似。这种方法包括有物体的内在信息,从而实现体数据的表达。


MC方法求等值面的算法流程:

① 将三维离散规则数据场分层读入内存;

② 扫描两层数据,逐个构造体元,每个体元中的8个角点取自相邻的两层;

③ 将体元每个角点的函数值与给定的等值面C作比较,根据比较结果,构造该体元的状态表;

④ 根据状态表,得到将与等值面有角点的体元边界;

⑤ 通过线性插值方法,计算出体元边界与等值面的交点;

⑥ 利用中心差分方法,求出体元各角点处的法向量,再通过线性插值方法,求出三角形各顶点处的法向量;

<7> 根据各三角面片各顶点的坐标值及法向量绘制等值面图像。


VTK官网给出的例子

#include "stdafx.h"

#include <vtkAutoInit.h>  
VTK_MODULE_INIT(vtkRenderingOpenGL2);  
VTK_MODULE_INIT(vtkInteractionStyle);  


#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkImageData.h>
#include <vtkSphereSource.h>
#include <vtkVoxelModeller.h>
#include <vtkRenderWindow.h>
#include <vtkSmartPointer.h>
#include <vtkMarchingCubes.h>
#include <vtkPolyDataMapper.h>
#include <vtkDICOMImageReader.h>
#include <vtkRenderWindowInteractor.h>


int _tmain(int argc, _TCHAR* argv[])
{
	//  std::string folder = "C:\\Users\\yorktal03\\Desktop\\ZYH\\data\\MarchingMan";

	vtkSmartPointer<vtkSphereSource> sphere = vtkSphereSource::New();
	sphere->SetPhiResolution(20);
	sphere->SetThetaResolution(20);
	sphere->Update();
	
	double bounds[6];
	// GetBounds()
	// Return a pointer to the geometry bounding box in the form (xmin,xmax, ymin,ymax, zmin,zmax). 
	// THIS METHOD IS NOT THREAD SAFE. 
	sphere->GetOutput()->GetBounds(bounds);
	/*for (unsigned int i = 0; i < 6; i += 2)
	{
		double range = bounds[i + 1] - bounds[i];
		bounds[i] = bounds[i] - .1 * range;
		bounds[i + 1] = bounds[i + 1] + .1 * range;
	}*/

	vtkSmartPointer<vtkVoxelModeller> voxelModeller = vtkVoxelModeller::New();
	voxelModeller->SetSampleDimensions(50, 50, 20);
	voxelModeller->SetModelBounds(bounds);
	voxelModeller->SetScalarTypeToFloat();
	voxelModeller->SetMaximumDistance(.1);
	voxelModeller->SetInputConnection(sphere->GetOutputPort());
	voxelModeller->Update();
	
	vtkSmartPointer<vtkImageData> volume = vtkSmartPointer<vtkImageData>::New();
	volume->DeepCopy(voxelModeller->GetOutput());

	/*vtkSmartPointer<vtkDICOMImageReader> imgs = vtkDICOMImageReader::New();
	imgs->SetDirectoryName(folder.c_str());
	imgs->Update();	
	volume->DeepCopy(imgs->GetOutput());*/

	vtkSmartPointer<vtkMarchingCubes> surface = vtkMarchingCubes::New();
	surface->SetInputData(volume);
	surface->ComputeNormalsOn();
	surface->SetValue(0, 0.5);

	vtkSmartPointer<vtkPolyDataMapper> mapper = vtkPolyDataMapper::New();
	mapper->SetInputConnection(surface->GetOutputPort());
	mapper->ScalarVisibilityOff();

	vtkSmartPointer<vtkActor> actor = vtkActor::New();
	actor->SetMapper(mapper);

	vtkSmartPointer<vtkRenderer> ren = vtkRenderer::New();
	ren->AddActor(actor);
	ren->SetBackground(0.1, .2, .3);

	vtkSmartPointer<vtkRenderWindow> renWin = vtkRenderWindow::New();
	renWin->AddRenderer(ren);
	renWin->Render();

	vtkSmartPointer<vtkRenderWindowInteractor> irenwin = vtkRenderWindowInteractor::New();
	irenwin->SetRenderWindow(renWin);
	irenwin->Start();

	return 0;
}
两种不同的输入数据,一种是绘制一个球体:


一种是从DICOM图像列;


读取图像然后显示图像好像没有什么麻烦,只是绘制立体图以及参数的设置还是需要学习的。


voxelModeller  :将无规则的数据集转化为体素表示。

体素(voxel),是体积元素(volumepixel)的简称。
vtkVoxelModeller默认输出的图像是 VTK_BIT 图像,但是MC不支持这个类型的图像,所以 SetScalarTypeToFloat() 得到一个Float的图像。


当然这边也有其他比较复杂的例子

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Marching Cubes算法是一种常用的三维体数据表面重建算法。它可以将一个体数据集转化为连续的多边形网格模型。 在三维体数据中,每个体素的值表示其在某一属性上的特征,如密度、压力等。Marching Cubes算法首先将整个体数据集划分为无数个小立方体,每个小立方体包含8个顶点。然后根据每个小立方体顶点所代表的属性值与事先设定的阈值进行比较,确定该顶点是否在表面上。若在表面上,就将相应顶点连接起来组成一个面,并将该面连接到整个网格模型上。 得到的多边形网格模型可以用于可视化、仿真和分析等应用。Marching Cubes算法具有简单、高效的特点,适用于各种不规则的三维体数据集。它广泛应用于医学图像处理、地质勘探、计算机动画等领域。 然而,Marching Cubes算法也存在一些限制。首先,它在重建过程中产生的多边形可能存在不连续性和拓扑错误。为了解决这个问题,后续研究提出了一些改进算法,如Dual Marching Cubes和Extended Marching Cubes。其次,Marching Cubes算法对数据集的分辨率要求较高,对于过于细致的结构可能无法很好地重建。 总的来说,Marching Cubes算法在三维体数据表面重建领域具有重要的应用价值,其简单、高效的特点使其成为一种常用的算法。随着相关技术的不断发展,对Marching Cubes算法的改进和优化将进一步推动其在各个领域的应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值