
基于alpha shapes的点云边缘点提取(python版本)
详细介绍了基于python、alpha shapes提取边缘点原理及过程
1、原理介绍
由Edelsbrunner H提出的alpha shapes算法是一种简单、有效的快速提取边界点算法。如下图所示,对于任意形状的平面点云,若一个半径为a的圆,绕其进行滚动,其滚动的轨迹形成的点为轮廓点。需要注意的是,alpha shapes算法只能探测二维点的轮廓点。因此在提取点云轮廓点直线,需要将点投影在二维平面上,一般是XOY平面,此时将所有点的z坐标均设置成相同的常数即可,如z=0。
2、部分代码解析
基于python的alpha shapes算法进行边缘检测,其涉及到2个库,可视化库matplotlib,搜索近邻点库scipy。测试可视化结果包括原始点云可视化、边缘提取结果可视化、边缘点与原始点云可视化、滚动圆可视化四部分。
基于python编写的源代码下载链接:https://download.csdn.net/download/qq_32867925/89431667
文件包括程序脚本alphashapes提取边缘.py以及3个测试数据,如下图所示。
将py文件直接在pycharm中打开,并点击绿色三角进行运行即可,如下图所示。
2.1 点云读取
在测试时,利用列表结构将文本点云数据进行存储,如下:
with open('E:\\圆形.txt', 'r') as file:
# 初始化一个列表来存储所有的点
points2D = []
points3D = []
# 逐行读取数据
for line in file:
# 去除行尾的换行符并分割字符串
x, y, z= line.strip().split(',')
# 将字符串转换为浮点数
x = float(x)
y = float(y)
z = float(z)
# 将点添加到列表中
points2D.append((x, y))
2.2 判断点是否为边缘点
判断一个点是否为边缘点,即所有点到计算的两个圆距离,若均大于半径,则为边缘点,否则为非边缘点。不分代码如下:
if count == len(nearpts)-1: #全部属于某一个圆
bounpts.append((x,y))
circle_XY.append((x2,y2))
break
elif count01 == len(nearpts)-1:#全部属于某一个圆
bounpts.append((x,y))
circle_XY.append((x21,y21))
break
3、结果测试
源代码基于python编写,在pycharm平台上运行,下载链接如下:https://download.csdn.net/download/qq_32867925/89431667?spm=1001.2014.3001.5503
3.1 无孔洞点云
如下图为一圆形形状点云边缘点提取结果,可以发现提取的边缘点比较理想,边缘点都被准确提取出。同时,滚动圆位于边缘点,符合算法原理,即滚动圆绕圆进行滚动,滚动轨迹即为边缘点。
![]() | ![]() |
原始点云可视化 | 边缘点可视化 |
![]() | ![]() |
边缘点与原始点云可视化 | 滚动圆提取边缘点可视化 |
3.2 有孔洞点云
有些特殊形状的点云,如包含内部孔洞,alpha shapes仍可以准确提取出来,且效果不错,如下图所示,滚动圆在内部进行滚动,提取出轮廓边缘点,效果理想,说明程序运行正确。
![]() | ![]() |
原始点云可视化 | 边缘点可视化 |
![]() | ![]() |
边缘点与原始点云可视化 | 滚动圆提取边缘点可视化 |
3.3 滚动圆半径对结果影响
如下图所示,展示了不同滚动圆半径对提取结果的影响,其中左边图轮廓点,与右边滚动圆相对应。
滚动圆半径radius为0.01提取结果:
![]() | ![]() |
滚动圆半径radius为0.015提取结果:
![]() | ![]() |
滚动圆半径radius为0.025提取结果:
![]() | ![]() |
可知,radius设置越大,提取的边缘点越少,这是由于凹拐角处的边缘点,会被漏提取导致。
4、总结
介绍了基于python语言,根据alpha shapes算法提取轮廓点,并使用图像对原理进行展示。
更多推荐
所有评论(0)