三维等值面提取算法(Dual Contouring)

  上一篇介绍了Marching Cubes算法,Marching Cubes算法是三维重建算法中的经典算法,算法主要思想是检测与等值面相交的体素单元并计算交点的坐标,然后对不同的相交情况利用查找表在体素单元内构建相应的网格拓扑关系。Marching Cubes算法简单,但是存在一些缺陷:1.模型二义性问题;2.模型特征问题。

  对于二义性问题,以2D情形为例,存在一个单元中同一顶点状态而不同的连接方式(如下图所示)。

图:2D中Marching Cubes算法的二义性问题

  那么对于上图中两种连接方式的不同选择,可能会导致在同一张图像上完全不同的结果(如下图所示),二义性在3D中的直接后果是产生“孔洞”。如果在一个单元中,一条对角线的两端点值大于等值面阈值,另一条对角线的两端点值小于等值面阈值,那么通常会发生这种二义性问题。

图:二义性问题的不同结果

  对于特征问题,由于Marching Cubes算法只计算体素单元的交点坐标信息,并根据这些交点连接的三角面片来构建体素单元内的几何模型,这样假如体素单元内存在几何模型的特征信息(棱边、棱角),但是Marching Cubes算法最终构建出的几何模型会缺少这些特征信息(如下图所示)。

图:左上-交点坐标和法向;右上-Marching Cubes算法;左下-Extended Marching Cubes算法;右下-Dual Contouring算法

  Dual Contouring算法[Ju et al. 2002]也是经典的等值面提取算法,相比Marching Cubes算法,Dual Contouring算法利用Hermite数据(交点的位置和法向)进行等值面构建,它克服了Marching Cubes算法所出现的缺陷。具体算法分两步:

  第一步:利用二次误差函数生成顶点坐标

  对于每个与等值面相交的体素单元,通过最小化二次误差函数来生成一个顶点坐标:

其中pi为交点的位置,ni为交点的法向。

  误差函数可以写成矩阵形式:

其中矩阵A的行向量为交点的法向ni,向量b的每个元素为ni·pi

  极值点可以通过求解正则方程得到:

  但是文章指出这种方式会存在数值不稳定,并提出一种解决方法。基于QR矩阵分解计算正交矩阵Q,使得Q与[A b]相乘为如下上三角矩阵形式:

其中A‘为3*3的上三角矩阵,b‘为长度为3的向量,r为标量。

  那么误差函数可以变化为:

  然后再根据上式计算极值点x。

  第二步:生成网格面片

  对于每一条等值面相交的体素边,那么包含该体素边的4个相邻体素单元内必然都存在顶点,将这4个顶点连接生成1个四边形面片。

  文章[Schaefer et al. 2002]详细介绍了Dual Contouring算法的实现细节,通过总结该文可以得到Dual Contouring算法过程如下:

  对于每个与等值面相交的体素单元:

  1. 创建1个4*4的零矩阵用于存放QR矩阵分解的结果;

  2. 对于体素单元的每条相交边,计算交点的位置pi和对应的法向ni

  3. 将向量[ ni.x, ni.y, ni.z, dot(pi,ni) ]添加到4*4的零矩阵底部;

  4. 通过QR矩阵分解得到3*3的上三角矩阵A‘和向量b‘;

  5. 求解线性方程组A‘TAx = (A‘Tb‘ - A‘Tb‘c) , 其中c是体素单元中所有交点的质心位置;

  6. 将计算得到的偏移量x加上质心位置c即为体素单元中的顶点坐标;

  7. 如果计算得到的顶点坐标位于体素单元之外,那么顶点坐标用质心位置c来代替;

  8. 对于每一条相交的体素边,将其周围4个体素单元内的顶点连接生成1个四边形面片。

 

图:左- Marching Cubes算法;右-Dual Contouring算法

 

图:左- Marching Cubes算法;右-Dual Contouring算法

 

本文为原创,转载请注明出处:http://www.cnblogs.com/shushen

相关:

水泡动画模拟(Marching Cubes):http://www.cnblogs.com/shushen/p/5542131.html

参考文献:

[1] Tao Ju, Frank Losasso, Scott Schaefer, and Joe Warren. 2002. Dual contouring of hermite data. ACM Trans. Graph. 21, 3 (July 2002), 339-346.

[2] Scott Schaefer and Joe Warren. Dual contouring: The secret sauce. Technical Report 02-408, Department of Computer Science, Rice University, 2002.

[3] http://users.csc.calpoly.edu/~zwood/teaching/csc572/final15/kpidding/index.html

时间: 2024-10-25 21:33:07

三维等值面提取算法(Dual Contouring)的相关文章

[搜索]波特词干(Porter Streamming)提取算法详解(3)

 接上 [搜索]波特词干(Porter Streamming)提取算法详解(2) 下面分为5大步骤来使用前面提到的替换条件来进行词干提取. 左边是规则,右边是提取成功或者失败的例子(用小写字母表示). 步骤1 SSES -> SS                   caresses  ->  caress IES  -> I                          ponies    ->  poni ties      ->  ti SS   -> S

文本特征词提取算法

在文本分类中,需要先对文本分词,原始的文本中可能由几十万个中文词条组成,维度非常高.另外,为了提高文本分类的准确性和效率,一般先剔除决策意义不大的词语,这就是特征词提取的目的.本文将简单介绍几种文本特征词提取算法. 信息增益(IG) 对于一个系统,其信息熵为\(H(S)=-\sum_{i}^{C}P_ilog_2(P_i)\).\(C\)表示类别个数,\(P_i\)表示第\(i\)的类别的概率.某个特征\(F\),有该特征和没有该特征,信息量的变化,就是信息增益. 对特征\(F\),它的取值有\

【转】【矩阵】三维坐标旋转矩阵算法

3D数学 ---- 矩阵和线性变换 一般来说,方阵能描述任意线性变换.线性变换保留了直线和平行线,但原点没有移动.线性变换保留直线的同时,其他的几何性质如长度.角度.面积和体 积可能被变换改变了.从非技术意义上说,线性变换可能“拉伸”坐标系,但不会“弯曲”或“卷折”坐标系. 矩阵是怎样变换向量的 向量在几何上能被解释成一系列与轴平行的位移,一般来说,任意向量v都能写成“扩展”形式: 另一种略有差别的形式为: 注意右边的单位向量就是x,y,z轴,这里只是将概念数学化,向量的每个坐标都表明了平行于相

基于高维聚类技术的中文关键词提取算法

[摘要]关键词提取是中文信息处理技术的热点和难点,基于统计信息的方法是其中一个重要分支.本文针对基于统计信息关键词提取方法准确率低的问题,提出基于高维聚类技术的中文关键词提取算法.算法通过依据小词典的快速分词.二次分词.高维聚类及关键词甄选四个步骤实现关键词的提取.理论分析和实验显示,基于高维聚类技术的中文关键词提取方法具备更好的稳定性.更高的效率及更准确的结果. 引言  关键词提取是通过对一篇输入文章做内容分析,按一定比例或字数要求提取出重要且语义相似性凝聚的关键词的过程.关键词自动提取是文本

文本关键词提取算法

1.TF-IDF 2.基于语义的统计语言模型 文章关键词提取基础件能够在全面把握文章的中心思想的基础上,提取出若干个代表文章语义内容的词汇或短语,相关结果可用于精化阅读.语义查询和快速匹配等. 采用基于语义的统计语言模型,所处理的文档不受行业领域限制,且能够识别出最新出现的新词语,所输出的词语可以配以权重. 3.TF-IWF文档关键词自动提取算法 针对现有TF-IWF的领域文档关键词快速提取算法.该算法使用简单统计并考虑词长.位置.词性等启发性知识计算词权重,并通过文档净化.领域词典 分词等方法

论文:LSD-线段提取算法

前言 参考资料: 论文主页:LSD: a Line Segment Detector  Rafael Grompone von Gioi, Jérémie Jakubowicz, Jean-Michel Morel, Gregory Randall 博客:基于LSD的直线提取算法 by tianwaifeimao 博客:线特征 by essica&jie 致谢 摘要 本文中的LSD算法是一种线段(line segment)检测算法,能够在线性时间内得到亚像素级精度的检测结果.它无需调试参数就可以

关键字提取算法TF-IDF和TextRank(python3)————实现TF-IDF并jieba中的TF-IDF对比,使用jieba中的实现TextRank

关键词:    TF-IDF实现.TextRank.jieba.关键词提取数据来源:    语料数据来自搜狐新闻2012年6月-7月期间国内,国际,体育,社会,娱乐等18个频道的新闻数据    数据处理参考前一篇文章介绍:    介绍了文本关键词提取的原理,tfidf算法和TextRank算法    利用sklearn实现tfidf算法    手动python实现tfidf算法    使用jieba分词的tfidf算法和TextRank提取关键词 1.关键字提取: 关键词抽取就是从文本里面把跟这

音乐旋律提取算法 附可执行demo

前面提及过,音频指纹算法的思路. 也梳理开源了两个比较经典的算法. https://github.com/cpuimage/shazam https://github.com/cpuimage/AudioFingerprinter 后来一段时间,稍微看了下这两个算法,还有不少可以精简优化的空间. 例如抗噪,特征有效性等优化思路. 音频指纹切片后的hash特征信息还是太多了, 不过作为哼唱搜歌的基本应用,是足够的了. 不过我觉得还是可以再进一步提取歌曲的旋律特征的,在音频指纹的基础上更进一步. 旋

关键字提取算法TF-IDF

在文本分类的学习过程中,在"如何衡量一个关键字在文章中的重要性"的问题上,遇到了困难.在网上找了很多资料,大多数都提到了这个算法,就是今天要讲的TF-IDF. 总起 TF-IDF,听起来很高大上啊,其实理解起来相当简单,他实际上就是TF*IDF,两个计算值的乘积,用来衡量一个词库中的词对每一篇文档的重要程度.下面我们分开来讲这两个值,TF和IDF. TF TF,是Term Frequency的缩写,就是某个关键字出现的频率,具体来讲,就是词库中的某个词在当前文章中出现的频率.那么我们可