The algorithm is described in [1]. I've started a Jupyter Notebook that outlines the steps, but for those who just want to run with it, here is a pipeline that will apply the filter. Doing it this way, it's a bit slow (think 30 minutes for about 1.4M points on my MBP), but results look pretty good - perhaps good enough to justify coding up in C++ as a new stage.
Requires PDAL built with Python support, and Python packages astropy
, numpy
, pandas
, and scipy
. The parameters S
, k
, n
, and b
could be exposed as pdalargs
to be user-defined. These values were appropriate for some of the ISPRS datasets.
[1] D. Mongus, N. Lukac, and B. Zalik, “Ground and building extraction from LiDAR data based on differential morphological profiles and locally fitted surfaces,” ISPRS J. Photogramm. Remote Sens., vol. 93, no. January, pp. 145–156, 2014.