This exercise uses PDAL to classify ground returns using the Simple Morphological Filter (SMRF) technique.
This exercise is an adaptation of the pcl_ground tutorial on the PDAL website by Brad Chambers. You can find more detail and example invocations there.
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 Simple Morphological Filter technique to generate a ground surface.
You can read more about the specifics of the SMRF algorithm from [Pingle2013]_
Invoke the following command, substituting accordingly, in your Conda Shell:
1pdal translate ./exercises/analysis/ground/CSite1_orig-utm.laz \ 2-o ./exercises/analysis/ground/ground.laz \ 3smrf \ 4-v 4
1pdal translate ./exercises/analysis/ground/CSite1_orig-utm.laz ^ 2-o ./exercises/analysis/ground/ground.laz ^ 3smrf ^ 4-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.
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 SMRF with a call to a the filters.outlier technique we learned about in denoising.
Let us start by removing the non-ground data to just view the ground data:
1pdal translate \ 2./exercises/analysis/ground/CSite1_orig-utm.laz \ 3-o ./exercises/analysis/ground/ground.laz \ 4smrf range \ 5--filters.range.limits="Classification[2:2]" \ 6-v 4
1pdal translate ^ 2./exercises/analysis/ground/CSite1_orig-utm.laz ^ 3-o ./exercises/analysis/ground/ground.laz ^ 4smrf range ^ 5--filters.range.limits="Classification[2:2]" ^ 6-v 4
1pdal translate ./exercises/analysis/ground/CSite1_orig-utm.laz \ 2-o ./exercises/analysis/ground/denoised-ground-only.laz \ 3outlier smrf range \ 4--filters.outlier.method="statistical" \ 5--filters.outlier.mean_k=8 --filters.outlier.multiplier=3.0 \ 6--filters.smrf.ignore="Classification[7:7]" \ 7--filters.range.limits="Classification[2:2]" \ 8--writers.las.compression=true \ 9--verbose 4
1pdal translate ./exercises/analysis/ground/CSite1_orig-utm.laz ^ 2-o ./exercises/analysis/ground/denoised-ground-only.laz ^ 3outlier smrf range ^ 4--filters.outlier.method="statistical" ^ 5--filters.outlier.mean_k=8 --filters.outlier.multiplier=3.0 ^ 6--filters.smrf.ignore="Classification[7:7]" ^ 7--filters.range.limits="Classification[2:2]" ^ 8--writers.las.compression=true ^ 9--verbose 4
In this invocation, we have more control over the process. First the outlier
filter merely classifies outliers with a
Classification value of 7. These
outliers are then ignored during SMRF processing with the
Finally, we add a range filter to extract only the ground returns (i.e.,
Classification value of 2).
The result is a more accurate representation of the ground returns.