界面重建——Marching cubes算法
一、引子
对于一个标量场数据,我们可以描绘轮廓(Contouring),包括2D和3D。2D的情况称为轮廓线(contour lines),3D的情况称为表面(surface)。他们都是等值线或等值面。
以下是一个2D例子:

为了生成轮廓,必须使用某种形式的插值。这是因为我们只在数据集中的一个有限点集上有标量值,而我们的等高线值可能位于这两个点的值之间。由于最常见的插值技术是线性插值,我们通过沿边缘的线性插值在轮廓表面上生成点。如果一条边在其两个端点上有标量值10和0,如果我们试图生成一条值为5的等高线,则边缘插值计算该等高线通过边缘的中点。
二、Marching cubes算法——从2D理解
运用了分治思想,对每个单元格(cell)独立地进行处理。该技术的基本假设是,一个轮廓只能以有限数量的方式通过一个单元格。我们可以构造一个案例表(case table),它枚举一个单元的所有可能的拓扑状态(topological state)。拓扑状态的数量取决于单元格顶点的数量,以及一个顶点相对于轮廓值可以具有的内部/外部关系的数量。标量值大于轮廓值的顶点被称为在轮廓之内。标量值小于轮廓值的顶点被称为在轮廓之外。例如,如果一个单元格有四个顶点,并且每个顶点可以在轮廓内部或外部,则有2^4 = 16种可能的方式通过单元格(在实现时可以用bit来实现)。在案例表中,我们不感兴趣的是轮廓通过单元格的位置(例如,geometrical intersection),感兴趣的只是它如何通过单元格(即单元格中轮廓的topology)。

一旦我们选择好属于哪一种case之后,就可以使用插值来计算contour line与cell edge相交的位置。该算法处理一个单元格,然后移动,或行进到下一个单元格。在访问所有单元格后,将完成轮廓。因此称为marching cubes。
算法的步骤如下:

四、算法需要注意的事项
在2D中,轮廓模糊(ambiguos cases,如Fig6.5中的Case 5和Case 10)很容易处理:对于每个模糊的情况,我们选择实现两种可能的情况中的一种。根据选择的不同,轮廓可以延伸或打破当前的轮廓,如Fig 6.9所示。任何一种选择都是可以接受的,因为产生的等高线(contour line)将是连续的和封闭的(或将在数据集(data set)边界结束)。

在3D中,这个问题更为复杂。我们不能简单地选择一个独立于所有其他模糊案例的模糊案例。例如,Fig 6.9显示了如果我们不小心实现了两个相互独立的情况,会发生什么。在这个图中,我们使用了通常的情况3,但用它的互补情况替换了情况6。互补的情况是通过将“暗”顶点与“光”顶点交换而形成的。(这相当于将顶点标量值从等值面值以上切换到等值面值以下,反之亦然。)将这两种情况配对的结果是在等值面上留下了一个孔(hole)。
一个简单而有效的解决方案通过添加额外的互补案例(complementary cases),扩展了原来的15个marching cubes案例。这些情况被设计成与邻近的情况兼容,并防止在等值面上产生孔。需要6个互补的情况,分别对应于行进立方体的情况3、6、7、10、12和13。互补的行进立方体案例如Fig 6.10所示。

此外,尽管我们说该算法用于规则类型,如四边形和立方体,但marching cubes可以应用于任何拓扑上等同于立方体的单元类型(例如,六面体或非立方体体素)。
五、应用
Fig 6.11d是由marching cubes创建的等值面。图6.11b是一个来自计算机断层扫描(CT)x射线成像系统的恒定图像强度(image intensity)的表面。(图6.11a是该数据的二维子集。)其强度水平对应于人的骨骼。图6.11c为恒定流密度(flow density)的等值面。图6.11d为铁蛋白分子的电子势等值面。由于我们熟悉人体解剖学,图6.11b中所示的图像可以立即被识别出来。然而,对于计算流体动力学和分子生物学领域的从业者来说,图6.11c和图6.11d同样熟悉。正如这些例子所显示的,轮廓形成的方法是各领域可视化数据的强大而又通用的技术。

参考文档:VTKTextBook Scalar Algorithms
界面重建——Marching cubes算法的更多相关文章
- 图像数据到网格数据-1——Marching Cubes算法的一种实现
概述 之前的博文已经完整的介绍了三维图像数据和三角形网格数据.在实际应用中,利用遥感硬件或者各种探测仪器,可以获得表征现实世界中物体的三维图像.比如利用CT机扫描人体得到人体断层扫描图像,就是一个表征 ...
- 水泡动画模拟(Marching Cubes)
Marching Cubes算法是三维离散数据场中提取等值面的经典算法,其主要应用于医学领域的可视化场景,例如CT扫描和MRI扫描的3D重建等. 算法主要的思想是在三维离散数据场中通过线性插值来逼近等 ...
- Marching squares & Marching cubes
提要 Marching squares 主要是用于从一个地图(用二维数组表示)生成轮廓的算法.Marching cubes则相应的是在空间生成网格的方法.最常见的应用就是天气预报中气压图的生成.还经常 ...
- 移动立方体算法(Marching cubes algorithm)
百度百科: 医学图像三维重建的方法主要有两大类:一类是三维面绘制,另一类是三维体绘制.体绘制能够更真实地反映物体结构,但由于其运算量大,即使利用高性能的计算机也无法满足实际应用中交互操作的需要.因此, ...
- Marching squares 算法 获取轮廓(contour tracing)
https://en.wikipedia.org/wiki/Marching_squares http://blog.csdn.net/coolingcoding/article/details/1 ...
- 基于面绘制的MC算法以及基于体绘制的 Ray-casting 实现Dicom图像的三维重建(python实现)
加入实验室后,经过张老师的介绍,有幸与某公司合共共同完成某个项目,在此项目中我主要负责的是三维 pdf 报告生成.Dicom图像上亮度.对比度调整以及 Dicom图像三维重建.今天主要介绍一下完成Di ...
- 三维等值面提取算法(Dual Contouring)
上一篇介绍了Marching Cubes算法,Marching Cubes算法是三维重建算法中的经典算法,算法主要思想是检测与等值面相交的体素单元并计算交点的坐标,然后对不同的相交情况利用查找表在体素 ...
- 从点云到网格(三)Poisson重建
Possion重建是Kazhdan等2006年提出的网格重建方法[1].Possion重建的输入是点云及其法向量,输出是三维网格.Poisson有公开的源代码[2].PCL中也有Poisson的实现. ...
- 什么是体数据可视化(Volume data visualization)?及体绘制的各种算法和技术的特点?
该文对体数据进行综述,并介绍了体数据的各种算法和技术的特点. 前言 由于3D数据采集领域的高速发展,以及在具有交互式帧率的现代化工作站上执行高级可视化的可能性,体数据的重要性将继续迅速增长. 数据集可 ...
- PCL源码剖析之MarchingCubes算法
原文:http://blog.csdn.net/lming_08/article/details/19432877 MarchingCubes算法简介 MarchingCubes(移动立方体)算法是目 ...
随机推荐
- 循环文件夹汇总所有发票开具Excel文件数据
'xlsx cnADO.Open "provider=Microsoft.ACE.OLEDB.12.0;extended properties='excel 8.0;hdr=no;imex= ...
- vscode工程目录文件及文件夹摘选
在工程工作区下新建一个.vscode 文件夹中并新建一个名为"settings.json"的文件,然后在 settings.json 中输入如下内容: { "search ...
- C Ⅸ
数组例子:统计个数 #include <stdio.h> int main(void) { int x; int count[10]; int i; ...
- 七、CSS网格
构造一个5*5的网格,如下图所示,同一颜色表示同个区域,黑线表示间隔5px 1.普通方式建立网格 <!DOCTYPE html> <html> <body> < ...
- 深入理解css 笔记(6)
网格布局:flexbox 彻底改变了网页布局方式,但这只是开始.它还有一个大哥:另一个称作网格布局模块的新规范.这两个规范提供了一种前所未有的全功能布局引擎.跟 flexbox 类似,网格布局也是作用 ...
- axios请求本地文件404
解决办法:将json文件放在public文件夹下 请求页面的url路径这样写,不能加上../public/这样的路径,直接就是/aa.json
- 区块链技术与应用:02-BTC-密码学原理
本文为个人整理笔记,知识点来源于北京大学肖臻老师的<区块链技术与应用>公开课视频:https://www.bilibili.com/video/BV1Vt411X7JF?from=sear ...
- 写Java程序有感
最近我练习了Java的学生管理系统的程序代码,多亏了前段时间小学期的系统类练习,让我比较容易地就能够理解该题的题意,再根据我学到的相关的Java知识,就好像是一个套用公式的逻辑. 用到的相关知识: 1 ...
- Bootstarp5第三弹
五.文字排版 <.h1>-<.h6> <div class="container"> <h1>文字排版</h1> < ...
- Javaweb学习笔记第六弹
本章节的存在意义是:学到PreparedStatement反应较慢,理解不透彻,来做个比较,加深印象 详细讲述PrepareStatement 与 Statement 连接数据库的部分区别 在我学习的 ...