Python 3.x 基于PDAL的点云去噪

Python 3.x 基于PDAL的点云去噪,python-3.x,point-clouds,pdal,Python 3.x,Point Clouds,Pdal,我用地面激光雷达收集了非常密集的单返回点云,由大约700平方米内的8000多个点组成。它包括我想删除的噪声点。我在Python3.6的PDAL管道中使用filters.outlier json = """{ "pipeline":[ { "type":"readers.las", "filename":"/LASfiles/9A-1B_subset15m.las" }, { "type":"filters.outlier",

我用地面激光雷达收集了非常密集的单返回点云,由大约700平方米内的8000多个点组成。它包括我想删除的噪声点。我在Python3.6的PDAL管道中使用filters.outlier

json = """{
  "pipeline":[
    {
      "type":"readers.las",
      "filename":"/LASfiles/9A-1B_subset15m.las"
    },
    {
      "type":"filters.outlier",
      "method":"radius",
      "radius":1.0,
      "min_k":4
    },
    {
      "type":"writers.las",
      "filename":"/LASfiles/9A-1B_sub15m_denoise.las"
    }
  ]
}"""

import pdal
pipeline = pdal.Pipeline(json)
pipeline.validate() 
pipeline.execute()

代码运行良好,但创建了与原始点云相同的点云。我尝试更改半径的值,但得到了相同的结果。如果有人能告诉我出了什么问题,我将不胜感激。

这很简单。如果您再看一下,您会发现以下小片段:

值得注意的是,这两种过滤方法仅将分类值7应用于噪声点(根据LAS规范)。为了完全去除噪声点,用户可以在异常值过滤器的下游向管道中添加一个范围过滤器

{
    "type":"filters.range",
    "limits":"Classification![7:7]"
}
尝试在异常值过滤器之后将以下内容添加到管道中

{
    "type":"filters.range",
    "limits":"Classification![7:7]"
}

这将通过分类值不等于7(表示噪声)的每个点,并删除所有其他点。

感谢您的帮助@chambbj。问题是我的las文件来自单返回地面激光雷达,没有分类。在我的情况下,有没有其他方法可以使用PDAL消除噪音?@Sher你试过我的建议了吗?它会满足你的需求。即使数据一开始没有分类,异常值过滤器也会使用分类来标记噪波点,但会将它们保留在文件中。范围过滤器将删除噪声点。是的,我做了,但代码运行了24小时,没有完成,然后我停止了,因为我认为这段代码有问题。我会再试一次,让您知道。我显然不知道您的数据,但您可能需要重新考虑在异常值过滤器中使用的半径。如果您在原始运行中(添加范围过滤器之前)更改了其他内容,也会很好,因为您在原始查询中没有提到任何关于长时间运行的内容。范围筛选器不应显著影响运行时;大部分时间将用于在离群值过滤器本身内进行最近邻查询。