我正试图在具有skimage.measuresransac()功能的激光雷达点云中找到电力线.这是我第一次在python中处理这些模块,请放心.

到目前为止,我只知道如何可靠地从云中过滤低点或"地面"点,以减少需要处理的点的数量.

def filter_Z(las, threshold):
    filtered = laspy.create(point_format = las.header.point_format, file_version = las.header.version)
    filtered.points = las.points[las.Z > las.Z.min() + threshold]

    print(f'original size: {len(las.points)}')
    print(f'filtered size: {len(filtered.points)}')

    filtered.write('filtered_points2.las')

    return filtered

threshold是我手工输入的,因为在我处理的las文件中有一些令人讨厌的异常值,阻止我动态计算它.

The filtered point cloud, or one of them atleast looks like this: enter image description here

请注意顶部的红色异常值,可能是鸟或其他什么.与之相伴的是树木和建筑物的屋顶.如果有人想看这.las个文件,请告诉我.我不能在问题的主体中加入WetTransfer链接.

俯视图:

enter image description here

我已经尽可能多地研究了它,找到了它附带的skimage.measure模块和ransac函数.我打了一段时间来感受一下,现在我很难继续.

def ransac_linefit_sklearn(points):
    model_robust, inliers = ransac(points, LineModelND, min_samples=2, residual_threshold=1000, max_trials=1000)
    return model_robust, inliers

结果是可以预测的(我在2D云视图上运行了ransac次,只是为了让它在pc上更容易一些)

enter image description here

在我发布的示例中,使用它并不能真正产生任何好的结果.植被簇有太多的点,直线拟合通过它,因为它具有最高的点密度.

我试着用DBSCAN()分将分数聚在一起,但没有成功.我也try 了OPTICS(),但在我写的时候它还没有运行完.

从我在各种文章中读到的内容来看,最好的做法是将点进行聚类,并在每个单独的聚类上执行RANSAC以找到线条,但我真的不确定如何做到这一点,也不确定在这种情况下使用什么聚类方法.

有一件事我也很好奇,那就是过滤掉那些会影响模型匹配的大树.

推荐答案

RANSAC不足

只要您的数据符合模型周围的单峰分布,RANSAC就最有效.在这种点云的情况下,当只有一条带异常值的线时,其效果最好,但在鸟瞰时至少有5条线.查看this older SO篇讨论你问题的帖子.Francesco's response提出了一种基于迭代RANSAC的方法.

八叉树和奇异值分解

在我之前的工作中,同事们也处理过类似的问题.我的方法不太流利,但我知道得足够多,可以提供一些提示.

他们的做法类似于弗朗西斯科的建议.他们将点云划分为八叉树,并计算每个分区内的singular value decomposition(奇异值分解).产生的三个奇异值将对应于数据的几何分布.

  • 如果第一个奇异值明显大于其他两个奇异值,则这些点是线形的.
  • 如果第一个和第二个奇异值明显大于另一个,则这些点是平面状的
  • 如果这三个值的大小相似,那么数据只是一个点的"球体".

他们反复使用这些规则来排除哪些点最有可能不是直线的一部分.

文学

如果你想研究已发布的方法,也许this paper是一个很好的起点.电力线建模为双曲函数.

Python-3.x相关问答推荐

如何在Python Matplotlib中在x轴上放置点

如何获得大Pandas 的常见时间间隔

Django内置注销视图`不允许的方法(GET):/USERS/LOGOUT/`

泛型类型的参数的静态类型

我用Kivy创建的应用程序在安卓系统上运行时出错.(attributeerror:';class';对象没有属性';_javaclass__cls_storage';)

为什么不能用格式字符串 '-' 绘制点?

通过匹配第一列的行值,逐个单元格地添加两个Pandas 数据框中的浮点数

Pandas matplotlib:条形图占总数的百分比

python2和python3中的列表生成器

当我判断另一个 checkButton 时,如何判断两个 python tkinter checkButtons?

使用大型多个数据集,其中每个数据集包含多个值 - Pytorch

Python:获取未绑定的类方法

RGB 图像中最主要的 colored颜色 - OpenCV / NumPy / Python

Python:如何判断一个项目是否被添加到一个集合中,没有 2x(hash,lookup)

如何通过python打开文件

为什么变量 = 对象不像变量 = 数字那样工作

带有 Emacs 的 Python 3

新项目:Python 2 还是 Python 3?

在 Ipython 中使用 Pylint (Jupyter-Notebook)

交错4个相同长度的python列表