我正试图在具有skimage.measures
ransac()
功能的激光雷达点云中找到电力线.这是我第一次在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:
请注意顶部的红色异常值,可能是鸟或其他什么.与之相伴的是树木和建筑物的屋顶.如果有人想看这.las
个文件,请告诉我.我不能在问题的主体中加入WetTransfer链接.
俯视图:
我已经尽可能多地研究了它,找到了它附带的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上更容易一些)
在我发布的示例中,使用它并不能真正产生任何好的结果.植被簇有太多的点,直线拟合通过它,因为它具有最高的点密度.
我试着用DBSCAN()
分将分数聚在一起,但没有成功.我也try 了OPTICS()
,但在我写的时候它还没有运行完.
从我在各种文章中读到的内容来看,最好的做法是将点进行聚类,并在每个单独的聚类上执行RANSAC以找到线条,但我真的不确定如何做到这一点,也不确定在这种情况下使用什么聚类方法.
有一件事我也很好奇,那就是过滤掉那些会影响模型匹配的大树.