三维重建移动立方体法(Marching Cubes Algorithm)的查找表的构造
来源:互联网 发布:知乎的回答可以删除吗 编辑:程序博客网 时间:2024/05/01 05:32
最近在做基于CT的三维重建,准备用Marching cubes算法,实现该算法的难点之一就是查找表的构造,建表我采用了笨办法,即是一点一点的手动建立,我相信肯定有很多巧办法来建表,我没采用的原因是第一,我不想浪费脑细胞在这样的无关产品性能及算法优劣的次要方面上;第二,我觉得用手动一点一点的建表可以降低该算法中的核心部分的代码复杂度,使得核心部分处理起来更容易。
一个Cube有8个顶点,每个顶点有Inside和Outside两种状态,所以一个Cube里头三角片的分布总共可能有2^8=256种组合。考虑到Rotation和Invertion对称两种情况后,可以用15种Basic Cube来覆盖所有256种可能的情况。
但是仅仅通过这15种cubes来重建三维,会产生漏点的情况这是因为查找表产生了歧义:
Marching Cubes算法提出不久,就有人发现了它的歧义性。先从2D开始说起。
对上图的两种连接方式的不同选择,在同一张图像上可导致完全不同的结果。经过观察我们可知,这种歧义性只发生在:一个面上,如果一条对角线的两端点大于阈值,另一条对角线的两端点小于阈值的情况。在立方体中,我们把这种面称作歧义面。
把这个问题放到3D上就产生了Hole问题。先看(Direct类型)和它的补充模式(Reverse类型)。按上面的歧义面定义可知,当我们把两种类型交错使用就会产生下图最左边所示情况:
一种扩展的Marching Cubes算法可以解决这个问题。如下图:
扩展的Marching Cubes算法虽然并没有解决歧义性问题,但是很好的防止了漏点。G.M.Nielson等人提出了渐近线判别法。它通过计算等值面与体素边界面的交线(双曲线)的渐进线与体素的边界面的相互位置关系来判断等值面的正确连接方式。可以解决歧义性问题,具体的细节已经超出本文的讨论范围,如果对此感兴趣请查阅相关的文献。
【查找表的实现代码】代码经过测试并且已经用于公司的产品。
- 三维重建移动立方体法(Marching Cubes Algorithm)的查找表的构造
- Overview of the Marching Cubes Algorithm
- 一个极简的Marching Cubes算法实现
- Marching Cubes
- Marching Cubes
- Marching Cubes
- Marching Cubes
- Marching squares & Marching cubes
- Lightoj1211——Intersection of Cubes(立方体的交)
- 我的Fast marching...
- light oj 1211 - Intersection of Cubes (立方体的交集的体积)
- OpenGL笔记——Marching cubes算法
- 用构造函数计算不同立方体的体积
- 关于Marching Cube的一些疑惑思考
- O3D 例2- 立方体的移动、缩放和旋转
- O3D 例2- 立方体的移动、缩放和旋转
- 三维重建 的一个例子
- MITK三维重建的问题
- windows如何搭建android开发环境
- 相信你
- Matlab2010下使用FULLBNT工具箱建立复杂的动态贝叶斯网络
- sublime自定义代码片段+emmet插件自定义
- shell 脚本中总是会忘记的一些语法总结!!!!
- 三维重建移动立方体法(Marching Cubes Algorithm)的查找表的构造
- 查询集的统计
- openssl 用根证书验证一个用户证书
- sql 性能测试
- python 调用shell命令三种方法
- 捣毁病毒流氓软件窝点必查七个注册表
- C结构体之位域
- 委托
- 介绍Java中的接口与继承