http://malagis.com/marching-cubes-algorithm.html

1.等值面的定义及其三角面片近似

等值面是空间中的一张曲面,在该曲面上函数F(x,y,z)的值等于某一给定值。准确地讲,是指在某一网格空间中,假若每一结点保存着三变量函数F(x,y,z),而且网格单元在x,y,z方向上的连续采样值为F(x,y,z),则对于某一给定值Fi,等值面是由所有满足

S={(x,y,z) | F(x,y,z)=Fi}

的点组成的一张曲面。

按照此严格定义下得到的等值面表达式如下:

F(x,y,z)=a0+a1x+a2y+a3Z+a4xy+a5yz+a6xz+a7xyz

可以看出等值面是三次代数曲面,提取过程复杂而且不利于显示。为了简化等值面的提取,W.ELorenson和H.E.CIine在1987年提取了一种等值面的简化提取方法,该方法首先找到等值面经过的六面体网格,求出该六面体与等值面的交点,将这些交点按照一定的拓扑连接关系连接起来,作为等值面在该六面体网格中的近似表示。如图所示,为了叙述的方便以及程序的编写,对所有六面体的顶点采用如下的编码规定:

假设某一个六面体中顶点3的值比要提取的等值面值小,而其他的7个顶点比等值面值大,则显然等值面一定经过该六面体,而且该六面体内的等值面可以采用如图(4.1.1.2)所示的三角面片进行近似。

该方法虽然在处理时是针对数据场中的某一个六面体单元,似乎等值面的构造是相互独立的。但是处理完所有的六面体单元后,这些等值面之间确是统一,相互关联和连续的。由于它是以六面体为单位,一个接一个的处理,因此被称为MarehingCubes方法。

2.六面体单元网格与等值面的位置关系

MarhcingCubeS方法是采用三角面片来近似六面体内的实际等值面,假设我们得到了一个六面体与等值面的所有交点,这些交点之间该进行怎么样的拓扑连接呢?怎么样的拓扑连接才会保证不同六面体之间拓扑连接的一致性呢?为此,我们将根据六面体8个顶点的值与等值面的位置关系,制定不同的拓扑连接关系。

就一个六面体而言,假设某一个顶点的值大于(或者等于)给定的等值面值C,我们就将该点标记位置1,表示该顶点位于等值面之内(或者之上)。而如果某一个顶点的值小于给定的等值面值C,我们就将该点标记位置0,表示该顶点位于等值面之外。如果六面体中某一条边的一个顶点在等值面之内,另一个顶点在等值面之外,那么该边一定与等值面相交。根据这一方法,就可以确定等值面是否与当前处理的六面体相交。

每一个六面体有8个顶点,而每一个顶点都有0和l两种可能的状态,所以每一个六面体单元根据8个顶点0和1的分布,共有2/=256种不同的状态。如果去定义256种可能的拓扑连接,是十分繁琐的,而且容易出现错误。为此,我们利用两种不同的对称性去简化这256种可能的状态。

第一种对称性是利用等值面与8个交点的相对位置关系,如果将等值面的值和8个顶点的物理值的大小关系颠倒过来,六面体内等值面与六面体8个顶点的拓扑关系不会发生改变。也就是说,如果将一个六面体中其物理值大于给定值C的顶点和小于给定值C的顶点所标记的0,1值互换,生成的等值面是相同的(如图(4.1.1.3)。图(a)中顶点3的值大于等值面的值,而其他的7个顶点的值都小于等值面的值,图b()中顶点3的值小于等值面的值,而其他的7个顶点的值都小于等值面的值,在六面体内等值面连接都是一样的,所以可以归纳为一起。

第二种对称性是利用六面体8个顶点的旋转对称性,进一步对可能的状态进行组合”如图(4.1.1.4)所示,在这两种六面体内三角面的拓扑连接相对与图中的黑点来说,是一样的,因此,我们将它们组合成一类。经过上述两种对称性处理之后,我们得到了如图(4.1.1.5)所示的15种类型。

3.等值面与六面体单元边的求交

给定一个六面体单元,如何确定该立方体的类型以及等值面与该六面体的哪条边有交点,交点坐标的插值计算?

为了解决上面提出的问题,我们设计了一个六面体状态表,如图(4.1.1.6)所示,该状态表中的每一位可以表示出该单元体中一个顶点的0和l两种状态。根据这一状态表,我们就可以得到当前单元体的一个索引号。

得到当前单元体的索引号之后,我们就可以在插值边标记数组中知道该单元体的哪些边与等值面有交点。

Marchingcubes算法中进行了如下假设:即六面体网格单元在x,少,:方向是函数值是呈线性变化的。基于该假设,等值面与当前单元体边的交点就可以通过该边两个端点函数值的线性插值得到,插值公式如下:

P=P1+(isovalue一V1)(P2一P1)/(V2一V1)

其中P代表等值点坐标,P1、P2代表两个端点的坐标,V1、V2代表两个端点的物理量值,isovalue代表当前提取的数值。求出等值面与当前单元体所有交点之后,就可以将这些交点按照事先定义号的拓扑连接关系连接成三角面片,作为等值面在该单元中的近似表示。

4.近似等值面三角面片顶点的法向计算

为了利用图形硬件显示提取的等值面图像,必须给出形成等值面的三角面片的法向矢量方向。对于等值面上的每一点,其沿面的切线方向的剃度分量应该为零,因此,该点的梯度矢量的方向就代表了等值面在该点的法向方向。对于规则数据场,经常采用中心差分计算出数据体各个顶点处的梯度,然后通过当前单元体边的两个顶点的梯度进行线性插值,得到三角面片个顶点的梯度,即三角面片个顶点的法向方向。得到各个顶点的法向量之后,即可用光照模型计算出各数据点出的漫反射分量,更加突出提取的等值面边界。

假设数据体中数据点的数值以f(xi,yj,zk)表示,采用中心差分方法就可以求出该数据点处的梯度值,即

5.MacrhingCubes算法提取等值面的流程

(1)将原始数据经过预处理之后,读入特定的数组中;

(2)从网格数据体中提取一个单元体,成为当前单元体”同时获取该单元体的所有信息,例如8个顶点的值,坐标位置等;

(3)将当前单元体8个顶点的函数值与给定等值面值C进行比较,得到该单元体的状态表;

(4)根据当前单元体的状态表索引,找出与等值面相交的单元体棱边,并采用线性插值的方法,计算出各个交点的位置坐标;

(5)利用中心差分法,求出当前单元体8个顶点的法向量,在采用线性插值的方法,得到三角面片各个顶点的法向

(6)根据各个三角面片顶点的坐标,顶点法向量进行等值面图象的绘制.

MarchingCubes算法提取等值面的基本原理相关推荐

  1. MarchingCubes算法

    概述 之前的博文已经完整的介绍了三维图像数据和三角形网格数据.在实际应用中,利用遥感硬件或者各种探测仪器,可以获得表征现实世界中物体的三维图像.比如利用CT机扫描人体得到人体断层扫描图像,就是一个表征 ...

  2. PCL源码剖析之MarchingCubes算法

    MarchingCubes算法简介 MarchingCubes(移动立方体)算法是目前三围数据场等值面生成中最常用的方法.它实际上是一个分而治之的方法,把等值面的抽取分布于每个体素中进行.对于每个被处 ...

  3. 基于QT和Node.js的八叉树算法提取图片主题色

    资源下载地址:https://download.csdn.net/download/sheziqiong/85883609 资源下载地址:https://download.csdn.net/downl ...

  4. VTK从分割好的体数据获取等值面的方法(MarchingCube)

    vtk里面从分割好的体数据获取等值面的方法基本上都是基于MarchingCube的方法,有很多相关函数,一般从标记图像中获取等值面的方法为vtkDiscreteMarchingCubes.图像经过等值 ...

  5. 利用MSER算法提取图像区域(车牌区域)的OpenCV代码~

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 我的博客中前面已经写了两种方法来实现车牌区域的提 ...

  6. 优化算法系列-模拟退火算法(1)——基本原理枯燥版本

    优化算法系列之模拟退火算法(1)--基本原理枯燥版本 推荐书籍--><智能优化算法及其MATLAB实例(第二版)> 知乎上的形象描述: 一个锅底凹凸不平有很多坑的大锅,晃动这个锅使得 ...

  7. leaflet 降雨等值面的动画效果

    leaflet 降雨等值面的动画展示效果 参考1:https://www.msn.cn/zh-cn/weather/maps msn天气 参考2:https://github.com/lwsu/lea ...

  8. MATLAB光谱特征波长提取,uve算法提取光谱特征波长

    uve算法提取光谱特征波长 matlab 2021-1-15 下载地址 https://www.codedown123.com/60098.html uve算法提取光谱特征波长,matlab例程,结合 ...

  9. 使用YIN算法提取音频的F0 Contours

    使用YIN算法提取音频的F0 Contours的代码实现 简介 ​ ​ F0 Contours, 全称为Fundamental Frequency Contours, 它与Pitch Contours ...

最新文章

  1. nginx已添加systemctl,但不能开机自启动问题
  2. python accept解析_python中requests库使用方法详解
  3. 金猪钱罐——青龙羊毛
  4. ListView和GridView的缓存机制及measure过程
  5. java eden space_JVM虚拟机20:内存区域详解(Eden Space、Survivor Space、Old Gen、Code Cache和Perm Gen)...
  6. 使用Html5+C#+微信 开发移动端游戏详细教程 :(三)使用html5引擎搭建游戏框架...
  7. 华为P40售价曝光:有点不敢相信
  8. 学web前端好找工作吗?想给初学者们几点建议
  9. ConcurrentHashMap真的线程安全吗?
  10. 【微软2014实习生及秋令营技术类职位在线測试】题目2 : K-th string
  11. 正方教务管理系统服务器崩溃,正方教务管理系统应用中存在的问题及应对策略...
  12. java广告投放系统_广告投放系统
  13. 计算机仿真实验之一 霍尔效应测磁场,物理实验教程
  14. SRE Google运维解密——第二章Goolgle的生成环境介绍
  15. 血手耳机与笔记本驱动冲突
  16. 图像修复:专栏博文推荐查阅顺序
  17. Scrapy框架学习 - 爬取豆瓣电影排行榜TOP250所有电影信息并保存到MongoDB数据库中
  18. 强化学习——day31 多臂老虎机MAB的代码实现(Python)
  19. 【Linux常用服务器配置——Samba服务】
  20. 无线传感器网络路由协议AODV(Ad hoc on-demand distance vector routing)

热门文章

  1. EXCEL之VLOOKUP函数——查找、分组、排序
  2. Linux系统忘记密码解决办法
  3. Python 初学者趣味练习题汇编(共42题,中文版)
  4. 列线图工具_Nomogram
  5. (短信服务)java SpringBoot 阿里云短信功能实现发送手机验证码
  6. 站在新的起点上,扬帆起航
  7. 愉快的舞会c++_项目经理和开发人员如何才能(愉快地!)给出实际的发货日期...
  8. 你都用 Python 来做什么 学Python能做什么
  9. k-means聚类算法——c语言
  10. python 正则表达式匹配