平面点云的轮廓线计算-alpha shapes算法原理和实现
alpha shape算法又称为滚球法,是一种提取边界点的算法。跟凸壳提取相比,alpha shape算法能够了凹包情形,且对多个点云时 能勾勒出多个边界线,这是他的优势。
研究alpha shape算法的博文虽然不多,但也有相当数量了。但给出的算法大多有错误,或者只是部分实现。现将算法原理再梳理一遍。
如上图所示,alpha shape算法就好像在散点上设置一个半径为alpha的球在上面滚动,最后出来的线就是轮廓线。因此这个算法的滚球半径不能太小,否则可能不能将散点全部包起来。
alpha shape算法的具体流程:
- 输入点云坐标向量p,确定滚球半径r(即前文的alpha)
- 在p中任选一点p0(可以按p向量的排序来选,遍历所有点,也可以按照一定规则优选边界附近的)
- 以p0为中心2r为半径画圆,圆内的剩余点记为pr_cir
- 在pr_cir内任选一点(仍然可以按照序号来选,方便写成循环,尽管这样效率不高,但也是一种简单的实现方法)作为p1,然后计算出过p0和p1两点的圆心(当然应该有2个,圆心分别记为p2和p3)具体计算公式下面给出。
- 将去除p0和p1的剩余点记为pr_cirr,然后计算pr_cirr所有点和p2 p3两个圆心的距离,可以用一个循环实现,将所有计算出的距离放入一个数组d中,由于有两个圆心,d可以分为两个d1和d2.
- 判定是否为边界点的条件:只要pr_cirr内所有点到某一个圆的距离都大于r,就算是边界点。都大于r的意思是如果d1中最小值也大于r,且两个圆只要有一个就行,是“或”的关系。写成代码就是min(d1)>= r或min(d2)>=r。如果满足该要求,p1就是边界点,就可以定义新的p1开始下一轮循环了。
- 如果不能满足上述条件,进入步骤4继续计算,即遍历pr_cir,如果pr_cir所有点都不能满足要求,则不为边界点。
上面就是alpha shape算法的具体流程,有些博文对判定条件的描述有些模糊,可能会造成误解。注意,必须是两个圆有一个满足要求,就算边界点。有些点对两个圆是不能同时满足大于r的要求的,这样就找不到边界点。
计算圆心坐标的公式:
也可以用伪代码描述上述算法:
% 读入数据和半径
read data p
read r% 遍历p
outline = []
for i = 1: length(p)% 定义p0p0 = p(0)% 定义prpr = p(remove p0)% 定义pr_cirpr_cir = pr(inner 2*r)% 遍历pr_cirfor j = 1: length(pr_cir)% 定义p1p1 = pr_cir(0)% 定义pr_cirrpr_cirr = pr_cir(remove p1)% 计算圆心p2 = cir1(p0,p1)p3 = cir2(p0,p1)% 计算pr_cirr到圆心的距离for k = 1: length(pr_cirr)pk = pr_cirr(k)d1(k) = distance(p2,pk)d2(k) = distance(p3,pk)endmind1 = min(d1)mind2 = min(d2)if mind1>=r || mind2 >= routline = [outline p1]breakendend
end
obtain outline
按照这个算法,就能编出没有bug的alpha shape边界点算法了。
还参考了斯坦福这个教程,不过有点复杂,先放在这里吧。
https://graphics.stanford.edu/courses/cs268-11-spring/handouts/AlphaShapes/as_fisher.pdf
平面点云的轮廓线计算-alpha shapes算法原理和实现相关推荐
- PCL实现Alpha Shapes算法
说明: 本文所用方法都来自于网络查找,本文借鉴了一下其他博主的文章,在他的基础上实现了Alpha Shapes算法.然后写了一个Alpha Shapes演示程序. Alpha Shapes演示程序下载 ...
- 快速计算距离Annoy算法原理及Python使用
快速计算距离Annoy算法 基本原理 高维稀疏数据进行快速相似查找,可以采用learning to hash参考:Minhashing & LSH & Simhash 技术汇总,但高维 ...
- 【Gis】Alpha Shapes提取离散点凹边轮廓线(java实现)
Alpha Shapes算法介绍 计算几何中Alpha Shqpes描述欧氏平面有限点集形状的一组分段线性的简单曲线.Alpha Shqpes可以用来从一堆无序的点集中提取边缘,其本质是滚球法,通过控 ...
- alpha shapes提取边界原理及详细步骤
由Edelsbrunner H提出的alpha shapes算法是一种简单.有效的快速提取边界点算法.其克服了点云边界点形状影响的缺点,可快速准确提取边界点,其原理如下: 如下图所示,对于任意形状的平 ...
- 简单平面点云的内外侧轮廓提取
原点云如图所示: 外侧轮廓提取用的方法是经纬线扫描法,全轮廓提取的方法是alpha shapes算法(点云边界提取方法总结),从全轮廓中剔除外侧轮廓得到内侧轮廓. alpha shapes算法轮廓提取 ...
- 编辑距离算法原理及其实现
编辑距离算法用于判定两个字符串对象之间的相似度.如str1=qingzhiyu str2=pingzhiyu str3=abngzhiyu三个字符串对象.str2变为str1只需要经过一次更新操作来将 ...
- BM提供支持云的量子计算平台,以加速创新
IBM研究院日前首次宣布公众可试用IBM量子处理器.从5月4日开始,IBM通过云服务,使所有有兴趣亲自实践的人们可以接触到量子处理器,帮助科学家和科研社区加速科技创新,并在该领域激发出更多的前沿应用. ...
- 从今天开始,你就可以通过云“体验”量子计算了!
IBM量子计算科学家Jay Gambetta使用平板电脑与位于纽约Yorktown的IBM's T. J. Watson研究中心的IBM Quantum Experience交互,这是世界上首台基于I ...
- 输入参数的数目不足_机器学习算法—KMEANS算法原理及阿里云PAI平台算法模块参数说明...
概述: KMEANS算法又被成为K均值算法,是一种常用的聚类算法,由于不需要根据给定的训练集训练模型因此是一种无监督学习算法.其本质是根据选定的参数K将数据分类成K类,在聚类过程中从单一样本开始通过不 ...
最新文章
- 深入理解Python闭包概念
- php下字符与二进制互转函数,PHP 字符串与二进制互转
- JavaScript(一)——快速入门
- SAP S/4HANA里修改了Business Partner后的调试入口
- java 中 if与while的区别
- jzoj1478-堆排序【堆】
- 网管型工业交换机如何提高网路流量过滤?
- 目前最强开源人脸检测算法RetinaFace
- 大数据之-Hadoop完全分布式_完全分布式配置总结---大数据之hadoop工作笔记0040
- AndroidStudio:Path is not a readable directory.
- duilib绝对定位与相对定位
- 如何使用AForge调用本机摄像头
- 初识大数据 小孩子都懂的大数据
- 领域模型的概念:失血 贫血 充血 胀血
- Dcloud课程2 什么是Dcloud
- 博客相关 | 如何获取图片主题色并修改字体颜色
- 基于51单片机的水族箱温度水质监测智能宠物金鱼喂食器补氧换水proteus仿真原理图
- 【数据库修复】.Globeimposter-Alpha66qqz勒索病毒的数据库文件修复
- 爬虫爬取糗事百科段子
- Aqua Data Studio