基于模糊聚类和最小割的层次化网格分割算法(Hierarchical Mesh Decomposition)
网格分割算法是三维几何处理算法中的重要算法,具有许多实际应用。[Katz et al. 2003]提出了一种新型的层次化网格分割算法,该算法能够将几何模型沿着凹形区域分割成不同的几何部分,并且可以避免过度分割以及锯齿形分割边界。算法的核心思想是先利用模糊聚类的方法分割几何模型,并保留分割边界附近的模糊区域,然后利用最小割的方法在模糊区域里寻找准确的分割边界。算法主要包含以下4个步骤:
1. 计算网格中所有相邻面片之间的距离;
2. 计算每个面片属于不同分割区域的概率;
3. 迭代调整每个面片的概率,直到收敛;
4. 在模糊区域里寻找准确的分割边界。
下面以模型二分为例具体介绍上述计算过程,如果模型需要分割成多个部分,可以以此为基础进行层次化分割。
Step 1:
对于相邻面片fi和fj,定义它们两者之间的测地距离和角度距离(如下图所示)。测地距离为相邻面片质心之间的距离,而角度距离表达式如下:
上式中αij为相邻面片之间的二面角,对于凹边η = 1,对于凸边η取较小值(例如0.2)。
图:测地距离和角度距离示意图
构建网格的对偶图(如下图所示),网格中的每个面片对应对偶图中的一个顶点,同时如果网格中的两个面片相邻,那么对偶图中对应的两个顶点相连。图中边的权重定义为:
给定网格中任意的两个面片,它们之间的距离等于对偶图中两点之间的最近距离。在预处理阶段,需要计算并记录对偶图中所有顶点之间的最近距离。
图:网格与对偶网格
Step 2:
选择相距最远的两个面片REPA和REPB作为两个分割区域的种子面片,对于面片fi计算其分别属于两个区域的概率,面片fi属于区域B的概率为:
上式表明一个面片距离哪个区域更近,那么其属于哪个区域的概率更大。
图:概率分布图,红色点代表种子面片
Step 3:
利用模糊聚类的方法迭代更新两个区域的种子面片,具体如下:
1. 计算每个面片分别属于两个区域的概率;
2. 重新计算种子面片:
3. 迭代上述步骤直到种子面片不再发生变化。
当迭代收敛之后,可以将网格分为3个区域A,B和C,其中C区域为模糊区域,对应下图b中的红色部分。
A = {fi | PB(fi) < 0.5 – ε}
B = {fi | PB(fi) > 0.5 + ε}
C = {fi | 0.5 – ε ≤ PB(fi) ≤ 0.5 + ε}
Step 4:
在模糊区域中利用最小割的方法寻找准确边界,首先需要构建模糊区域的网络s-t图G = (V, E)(如下图所示),V和E如下:
V = VC∪VCA∪VCB∪{S,T}
E = EC∪{(S, v), ∀v∈VCA}∪{(T, v), ∀v∈VCB}∪{eij∈E | i∈VC, j∈{VCA∪VCB}}
其中VCA和VCB代表对偶图中与VC相连的VA和VB顶点集,而VA, VB, VC为对偶图中A, B, C区域面片所对应的顶点集。
s-t图中边的容量定义为:
根据上述定义,网络图最小割的结果对应网格中模糊区域内二面角最大的分割边界。
如果模型需要分割成多个部分,可以对每个区域继续进行分割,直到满足终止条件。
参考文献:
[1] Sagi Katz and Ayellet Tal. 2003. Hierarchical mesh decomposition using fuzzy clustering and cuts. ACM Trans. Graph. 22, 3 (July 2003), 954-961.
附录
K-means算法:
给定一系列数据样本(x1, x2, … , xn),其中每个数据都是一个d维向量,K-means聚类算法的目标是将这n个数据样本归类成k(≤n)个簇,并且满足如下最小能量函数:
其中μi表示第i个簇Si中数据点的平均值 。
算法具体步骤:
1. 随机设定k个聚类中心点的初始值μ1(0), μ2(0), …, μk(0)。
2. 将每个数据点归类到离它最近的那个聚类中心点所代表的簇中。
3. 重新计算每个簇的聚类中心点。
4. 重复第二步,直到迭代到最大步数或者前后两次能量函数的差值小于设定的阈值为止。
K-medoids算法:
K-medoids算法是K-means算法的一个变种,两者不一样的地方在于聚类中心点的选取。在K-means算法中,我们将中心点取为当前簇中所有数据点的平均值,而在K-medoids算法中,我们从当前簇中选取一个点作为聚类中心点,它满足到当前簇中其他所有点的距离之和最小。
在某些情况下,K-medoids聚类算法的结果要优于K-means算法,如下图所示,但从K-means算法变到K-medoids算法,时间复杂度会增加许多:K-means算法中计算聚类中心点只要求一个平均值O(N)即可,而在K-medoids算法中则需要枚举每个点,并求出它到所有其他点的距离之和,复杂度为 O(N2)。
图:在相同的数据和初始条件下,K-means算法(1a - 1f)的结果陷入局部最优解,而K-medoids算法(2a – 2h)的结果更加合理
Max-flow/Min-cut算法
图论中一个常见的问题是网络图中两个节点之间的最大流是多少?这个问题具有重要的现实意义,例如交通工程师希望知道两个城市之间道路的最大通行能力是多少,因为这个信息将决定如何扩建道路,最大流问题的数学描述如下:
s.t.
解决最大流问题的一个经典方法是Ford&Fulkerson算法,其方法如下:
我们以下图为例,解释Ford&Fulkerson算法的求解过程。网络图中边上方的标签代表该条边的最大容量,例如边AB上方靠近节点A的标签代表从节点A到节点B的最大容量,而靠近B节点的标签代表从节点B到节点A的最大容量。
求解从节点A到节点G的最大流,首先需要在当前网络图中寻找从节点A到节点G的路径,接着建立残余网络图,即从当前网络图中减去该路径上的最大流量,然后重复上述步骤直到网络图中不存在从节点A到节点G的路径为止。
通过上述方法可以发现当算法终止时,可以寻找得到5条从节点A到节点G的路径,所以该网络图的最大流值为4+3+4+2+1=14。而最大流的网络图如下:
最大流问题与最小割问题密切相关,网络图中的割是指网络图中一些边的集合,当网络图中移除这些边时能够导致网络流中断,而最小割就是指所有割中权重之和最小的一个割,下图给出了网络图中一些割集的情况。最小割问题的数学描述如下:
最大流/最小割定理指出,网络图中从源点到汇点的最大流值等于网络图中的最小割值。但真正问题是最小割的边在网络图中的位置,因为假如交通工程师决定扩展道路,那需要知道该扩展哪些道路。可以想象扩展那些最大流值还未达到最大容量的那些边是毫无意思的,而那些最大流值已达到最大容量的边才是我们关心的,也就是最小割的位置。
参考:
https://en.wikipedia.org/wiki/K-means_clustering
https://en.wikipedia.org/wiki/K-medoids
http://blog.pluskid.org/?page_id=78
http://www.sce.carleton.ca/faculty/chinneck/po/Chapter9.pdf
基于模糊聚类和最小割的层次化网格分割算法(Hierarchical Mesh Decomposition)的更多相关文章
- 基于模糊聚类和最小割的层次化三维网格分割算法(Hierarchical Mesh Decomposition)
网格分割算法是三维几何处理算法中的重要算法,具有许多实际应用.[Katz et al. 2003]提出了一种新型的层次化网格分割算法,该算法能够将几何模型沿着凹形区域分割成不同的几何部分,并且可以避免 ...
- hdu3870 基于最短路的最小割
题意: 给你一个平面图,让你输出(1,1),(n ,n)的最小割.. 思路: 看完题想都没想直接最大流,结果TLE,想想也是 G<400*400,400*400*4> ...
- 基于谱聚类的三维网格分割算法(Spectral Clustering)
谱聚类(Spectral Clustering)是一种广泛使用的数据聚类算法,[Liu et al. 2004]基于谱聚类算法首次提出了一种三维网格分割方法.该方法首先构建一个相似矩阵用于记录网格上相 ...
- 全局最小割Stoer-Wagner算法
借鉴:http://blog.kongfy.com/2015/02/kargermincut/ 提到无向图的最小割问题,首先想到的就是Ford-Fulkerson算法解s-t最小割,通过Edmonds ...
- PCL—点云分割(最小割算法) 低层次点云处理
1.点云分割的精度 在之前的两个章节里介绍了基于采样一致的点云分割和基于临近搜索的点云分割算法.基于采样一致的点云分割算法显然是意识流的,它只能割出大概的点云(可能是杯子的一部分,但杯把儿肯定没分割出 ...
- Vijos1734 NOI2010 海拔 平面图最小割
建立平面图的对偶图,把最小割转化成最短路问题 Dijkstra算法堆优化 (被输入顺序搞WA了好几次T_T) #include <cstdio> #include <cstring& ...
- bzoj 1001 平面图转对偶图 最短路求图最小割
原题传送门http://www.lydsy.com/JudgeOnline/problem.php?id=1001 整理了下之前A的题 平面图可以转化成对偶图,然后(NlogN)的可以求出图的最小割( ...
- Paratroopers(最小割模型)
http://poj.org/problem?id=3308 题意:一个m*n的网格,有L位火星空降兵降落在网格中,地球卫士为了能同时消灭他们,在网格的行或列安装了一个枪支,每行或每列的枪支都能消灭这 ...
- HYSBZ 1797 Mincut 最小割
Descrption A,B两个国家正在交战,其中A国的物资运输网中有N个中转站,M条单向道路.设其中第i (1≤i≤M)条道路连接了vi,ui两个中转站,那么中转站vi可以通过该道路到达ui中转站, ...
随机推荐
- java字符串比较及小数浮点型的使用
import java.text.DecimalFormat; /* * 小数类型的常量默认是double类型,声明float类型的常量需要使用F作为后缀. * * 关于equals()和==: 对于 ...
- 细说Asp.Net Web API消息处理管道(二)
在细说Asp.Net Web API消息处理管道这篇文章中,通过翻看源码和实例验证的方式,我们知道了Asp.Net Web API消息处理管道的组成类型以及Asp.Net Web API是如何创建消息 ...
- 游戏UI框架设计(二) : 最简版本设计
游戏UI框架设计(二) --最简版本设计 为降低难度决定先讲解一个最简版本,阐述UI框架的核心设计理念.这里先定义三个核心功能: 1:UI窗体的自动加载功能. 2:缓存UI窗体. 3:窗体生命周期(状 ...
- shell-2
环境变量配置文件: cd ~ 直接回到根目录 位置变量:$0 代表当前执行的文件名$1-$9 代表输入的参数分别一次${10} 注意:双引号和单引号双引号是弱引用,会解析里面的特殊字符所代表的含义单 ...
- #define宏与const的区别
1.#define宏的用法 #define用宏名代替一个字符串,这样便于修改,提高了程序的可移植性.编译器在编译预处理时只对宏做文本替换,而不进行类型检查,所以替换后可能产生一些副作用. 带参数的宏类 ...
- python2.7学习笔记-split用一个分隔符分割、多个分隔符分割、在有汉字存在的情况下split分割
还是直接上程序吧,暂且就叫它为程序吧: ''' 按照多个分隔符分割,split的用法 ''' import re s='hi!chu?lan!heihei' re.split('[!?]',s) '' ...
- sicily 1063. Who's the Boss 排序+递推
#include <cstdio> #include <algorithm> using namespace std; struct Emp{ int id, salary, ...
- input 即时搜索 监听输入值的变化
在 Web 开发中经常会碰到需要动态监听输入框值变化的情况,如果使用 onkeydown.onkeypress.onkeyup 这个几个键盘事件来监测的话,监听不了右键的复制.剪贴和粘贴这些操作,处理 ...
- 深入理解 JavaScript 异步系列(3)—— ES6 中的 Promise
第一部分,Promise 加入 ES6 标准 原文地址 http://www.cnblogs.com/wangfupeng1988/p/6515855.html 未经作者允许不得转载! 从 jquer ...
- 【2-23】分支语句(switch…case)及循环语句
Switch-case分支语句与if语句作用相同,但需将情况都罗列出比较麻烦所以不常用. 其基本结构是: Switch(一个变量值) { Case 值1:要执行的代码段:break; Case 值2: ...