Identifying ground¶
This exercise uses PDAL to classify ground returns using the Progressive Morphological Filter (PMF) technique.
Note
This excerise is an adaptation of the Identifying ground returns using ProgressiveMorphologicalFilter segmentation tutorial on the PDAL website by Brad Chambers. You can find more detail and example invocations there.
Exercise¶
The primary input for Digital Terrain Model generation is a point cloud with ground vs. not-ground classifications. In this example, we will use an algorithm provided by PDAL, the Progressive Morphological Filter technique to generate a ground surface.
See also
You can read more about the specifics of the PMF algorithm from the paper, and you can read more about the PDAL implementation in the source code on github.
Command¶
Invoke the following command, substituting accordingly, in your Docker Quickstart Terminal:
1 2 3 4 5 6 | docker run -v /c/Users/Howard/PDAL:/data -t pdal/pdal \
pdal ground \
/data/exercises/analysis/ground/CSite1_orig-utm.laz \
-o /data/exercises/analysis/ground/ground.laz \
--classify=true \
--writers.las.compression=true -v 4
|

As we can see, the algorithm does a great job of discriminating the points, but there’s a few issues.

There’s noise underneath the main surface that will cause us trouble when we generate a terrain surface.

Filtering¶
We do not yet have a satisfactory surface for generating a DTM. When we visualize the output of this ground operation, we notice there’s still some noise. We can stack the call to PMF with a call to a the filters.outlier technique we learned about in Removing noise.
- Let us start by removing the non-ground data:
1 2 3 4 5 6 | docker run -v /c/Users/Howard/PDAL:/data -t pdal/pdal \
pdal ground \
/data/exercises/analysis/ground/CSite1_orig-utm.laz \
-o /data/exercises/analysis/ground/ground-only.laz \
--classify=true --extract=true \
--writers.las.compression=true --verbose 4
|
Note
The filters.pmf.extract=true
item causes all data except
ground-classified points to be removed from the set.
Buildings and other non-ground points are removed with the extract
option
of filters.pmf

2. Now we will remove the noise, using the translate to stack the filters.outlier and filters.pmf stages:
1 2 3 4 5 6 7 8 9 10 11 | docker run -v /c/Users/Howard/PDAL:/data -t pdal/pdal \
pdal translate \
/data/exercises/analysis/ground/CSite1_orig-utm.laz \
-o /data/exercises/analysis/ground/denoised-ground-only.laz \
outlier pmf \
--filters.outlier.method="statistical" \
--filters.outlier.mean_k=8 \
--filters.outlier.multiplier=3.0 \
--filters.pmf.cell_size=1.5 \
--filters.pmf.extract=true \
--writers.las.compression=true --verbose 4
|
The result is a more accurate representation of the ground returns.
