alpha shape算法又称为滚球法,是一种提取边界点的算法。跟凸壳提取相比,alpha shape算法能够了凹包情形,且对多个点云时 能勾勒出多个边界线,这是他的优势。

研究alpha shape算法的博文虽然不多,但也有相当数量了。但给出的算法大多有错误,或者只是部分实现。现将算法原理再梳理一遍。

如上图所示,alpha shape算法就好像在散点上设置一个半径为alpha的球在上面滚动,最后出来的线就是轮廓线。因此这个算法的滚球半径不能太小,否则可能不能将散点全部包起来。

alpha shape算法的具体流程:

  1. 输入点云坐标向量p,确定滚球半径r(即前文的alpha)
  2. 在p中任选一点p0(可以按p向量的排序来选,遍历所有点,也可以按照一定规则优选边界附近的)
  3. 以p0为中心2r为半径画圆,圆内的剩余点记为pr_cir
  4. 在pr_cir内任选一点(仍然可以按照序号来选,方便写成循环,尽管这样效率不高,但也是一种简单的实现方法)作为p1,然后计算出过p0和p1两点的圆心(当然应该有2个,圆心分别记为p2和p3)具体计算公式下面给出。
  5. 将去除p0和p1的剩余点记为pr_cirr,然后计算pr_cirr所有点和p2 p3两个圆心的距离,可以用一个循环实现,将所有计算出的距离放入一个数组d中,由于有两个圆心,d可以分为两个d1和d2.
  6. 判定是否为边界点的条件:只要pr_cirr内所有点到某一个圆的距离都大于r,就算是边界点。都大于r的意思是如果d1中最小值也大于r,且两个圆只要有一个就行,是“或”的关系。写成代码就是min(d1)>= r或min(d2)>=r。如果满足该要求,p1就是边界点,就可以定义新的p1开始下一轮循环了。
  7. 如果不能满足上述条件,进入步骤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算法原理和实现相关推荐

  1. PCL实现Alpha Shapes算法

    说明: 本文所用方法都来自于网络查找,本文借鉴了一下其他博主的文章,在他的基础上实现了Alpha Shapes算法.然后写了一个Alpha Shapes演示程序. Alpha Shapes演示程序下载 ...

  2. 快速计算距离Annoy算法原理及Python使用

    快速计算距离Annoy算法 基本原理 高维稀疏数据进行快速相似查找,可以采用learning to hash参考:Minhashing & LSH & Simhash 技术汇总,但高维 ...

  3. 【Gis】Alpha Shapes提取离散点凹边轮廓线(java实现)

    Alpha Shapes算法介绍 计算几何中Alpha Shqpes描述欧氏平面有限点集形状的一组分段线性的简单曲线.Alpha Shqpes可以用来从一堆无序的点集中提取边缘,其本质是滚球法,通过控 ...

  4. alpha shapes提取边界原理及详细步骤

    由Edelsbrunner H提出的alpha shapes算法是一种简单.有效的快速提取边界点算法.其克服了点云边界点形状影响的缺点,可快速准确提取边界点,其原理如下: 如下图所示,对于任意形状的平 ...

  5. 简单平面点云的内外侧轮廓提取

    原点云如图所示: 外侧轮廓提取用的方法是经纬线扫描法,全轮廓提取的方法是alpha shapes算法(点云边界提取方法总结),从全轮廓中剔除外侧轮廓得到内侧轮廓. alpha shapes算法轮廓提取 ...

  6. 编辑距离算法原理及其实现

    编辑距离算法用于判定两个字符串对象之间的相似度.如str1=qingzhiyu str2=pingzhiyu str3=abngzhiyu三个字符串对象.str2变为str1只需要经过一次更新操作来将 ...

  7. BM提供支持云的量子计算平台,以加速创新

    IBM研究院日前首次宣布公众可试用IBM量子处理器.从5月4日开始,IBM通过云服务,使所有有兴趣亲自实践的人们可以接触到量子处理器,帮助科学家和科研社区加速科技创新,并在该领域激发出更多的前沿应用. ...

  8. 从今天开始,你就可以通过云“体验”量子计算了!

    IBM量子计算科学家Jay Gambetta使用平板电脑与位于纽约Yorktown的IBM's T. J. Watson研究中心的IBM Quantum Experience交互,这是世界上首台基于I ...

  9. 输入参数的数目不足_机器学习算法—KMEANS算法原理及阿里云PAI平台算法模块参数说明...

    概述: KMEANS算法又被成为K均值算法,是一种常用的聚类算法,由于不需要根据给定的训练集训练模型因此是一种无监督学习算法.其本质是根据选定的参数K将数据分类成K类,在聚类过程中从单一样本开始通过不 ...

最新文章

  1. 深入理解Python闭包概念
  2. php下字符与二进制互转函数,PHP 字符串与二进制互转
  3. JavaScript(一)——快速入门
  4. SAP S/4HANA里修改了Business Partner后的调试入口
  5. java 中 if与while的区别
  6. jzoj1478-堆排序【堆】
  7. 网管型工业交换机如何提高网路流量过滤?
  8. 目前最强开源人脸检测算法RetinaFace
  9. 大数据之-Hadoop完全分布式_完全分布式配置总结---大数据之hadoop工作笔记0040
  10. AndroidStudio:Path is not a readable directory.
  11. duilib绝对定位与相对定位
  12. 如何使用AForge调用本机摄像头
  13. 初识大数据 小孩子都懂的大数据
  14. 领域模型的概念:失血 贫血 充血 胀血
  15. Dcloud课程2 什么是Dcloud
  16. 博客相关 | 如何获取图片主题色并修改字体颜色
  17. 基于51单片机的水族箱温度水质监测智能宠物金鱼喂食器补氧换水proteus仿真原理图
  18. 【数据库修复】.Globeimposter-Alpha66qqz勒索病毒的数据库文件修复
  19. 爬虫爬取糗事百科段子
  20. Aqua Data Studio

热门文章

  1. 智慧交通,网约车终端解决方案基于arm平台的展现
  2. 平时有大量时间可以做什么兼职,分享五个居家兼职副业
  3. 联想Y9000P W11出现 你的PIN不可用,单击以重新设置PIN,也未设置其他的登录方式时的解决办法
  4. git在远程分支创建新分支进行开发的流程
  5. 未来趋势(老年用品店)
  6. PHP循环读取json数据
  7. java 中counter什么意思_(java初学)如何使用java写一个页面计数器?
  8. 一键解决adb 5037端口被占用
  9. 通俗易懂的GPT原理简介
  10. 手把手教你SQL Server 2019的下载安装配置