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算法提取轮廓点,并使用图像对原理进行展示。

点击阅读全文
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐