基于alpha shapes点云边缘点提取(python语言)

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、结果测试

3.1 无孔洞点云

      如下图为一圆形形状点云边缘点提取结果,可以发现提取的边缘点比较理想,边缘点都被准确提取出。同时,滚动圆位于边缘点,符合算法原理,即滚动圆绕圆进行滚动,滚动轨迹即为边缘点。

原始点云可视化 边缘点可视化
边缘点与原始点云可视化 滚动圆提取边缘点可视化

   3.2 有孔洞点云

         有些特殊形状的点云,如包含内部孔洞,alpha shapes仍可以准确提取出来,且效果不错,如下图所示,滚动圆在内部进行滚动,提取出轮廓边缘点,效果理想,说明程序运行正确。

原始点云可视化 边缘点可视化
边缘点与原始点云可视化 滚动圆提取边缘点可视化

3.3 滚动圆半径对结果影响

       如下图所示,展示了不同滚动圆半径对提取结果的影响,其中左边图轮廓点,与右边滚动圆相对应。

4、总结

      介绍了基于python语言,根据alpha shapes算法提取轮廓点,并使用图像对原理进行展示。

相关推荐

  1. 面向无组织中快速鲁棒的边缘提取方法

    2024-06-14 13:04:03       52 阅读
  2. PCL 在提取其子集(索引提取)

    2024-06-14 13:04:03       30 阅读
  3. PCL 中的平面提取

    2024-06-14 13:04:03       31 阅读
  4. Python 裁剪

    2024-06-14 13:04:03       36 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-14 13:04:03       91 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-14 13:04:03       97 阅读
  3. 在Django里面运行非项目文件

    2024-06-14 13:04:03       78 阅读
  4. Python语言-面向对象

    2024-06-14 13:04:03       88 阅读

热门阅读

  1. 蓝中面试(一)

    2024-06-14 13:04:03       33 阅读
  2. 云顶之弈-测试报告

    2024-06-14 13:04:03       33 阅读
  3. AtCoder Beginner Contest 357 C - Sierpinski carpet

    2024-06-14 13:04:03       51 阅读
  4. Threejs-11、材质文理颜色

    2024-06-14 13:04:03       32 阅读
  5. Flutter知识点

    2024-06-14 13:04:03       32 阅读
  6. 软件设计模式概述

    2024-06-14 13:04:03       27 阅读