I have data in LAS format with RGB values created from aerial photogrammetry using a UAV. I am trying to find a solution to extract the bare earth DEM from the point cloud.

I have tried SAGA, Fusion, MCC-LIDAR, but it is seems they need the LAS file to be already classified (which it naturally isn't). Can anyone point me in the right direction with a brief explanation of the process?

Generally, I would need to process about 100 mill points at a time (can tile them if needed).

  • MCC or Fusion do not require that your points be classified. The MCC program code does however, populate the classification field. What led you to believe that this is the case? You could be having a version issue with your las file which would be good to identify now. – Jeffrey Evans Sep 17 '14 at 0:25

Generating LiDAR DEMs from unclassified point clouds with:

MCC-LIDAR is a command-line tool for processing discrete-return LIDAR data in forested environments (Evans & Hudak, 2007).


  • a) unclassified point cloud.
  • b) ground returns classified.
  • c) bare-earth DEM (raster).

enter image description here

Let's create a hypothetical situation to further provide an example with code.

MCC-LIDAR is installed in:


The unclassified LiDAR point cloud (.las file) is in:


The output which are going to be the bare-earth DEM is in:


The example below classifies ground returns with the MCC algorithm and create a bare-earth DEM with 1 meter resolution.

#MCC syntax: 
#-s (spacing for scale domain)
#-t (curvature threshold)
#input_file (unclassified point cloud) 
#output_file (classified point cloud - ground -> class 2 and not ground -> class 1)
#-c (cell size of ground surface)
#output_DEM (raster surface interpolated from ground points)

C:\MCC\bin\mcc-lidar.exe -s 0.5 -t 0.07 C:\lidar\project\unclassified.las C:\lidar\project\classified.las -c 1 C:\lidar\project\dem.asc

To understand better how the scale (s) and the curvature threshold (t) parameters work, read: How to Run MCC-LiDAR and; Evans and Hudak (2007).

The parameters need to be calibrated to avoid commission/labeling errors (when a point is classified as belonging to the ground but actually it belongs to vegetation or buildings). For example:

enter image description here

The MCC-LIDAR uses Thin Plate Spline (TPS) interpolation method to classify ground points and generate the bare-earth DEM.


For more options about ground point classification algorithms, see Meng et al. (2010):

  • MCC lidar seems to battle with the number of points. It says insufficient memory, try larger post spacing. I tried post spacing grid of 5 from a 1m initial spacing. My memory is 96Gb on a strong workstation so that cannot possibly be the problem. – user32307 Sep 13 '14 at 5:11
  • @user32307, see this post, which reports the same problem. The answer there might help you. – Andre Silva Sep 15 '14 at 0:58

I think that LasTools might suit your needs, see LASGround. The license is a bit funny depending on what tools. The tools can be downloaded and evaluated prior to purchase; also the product is relatively inexpensive.


I have had good luck with FUSION's (manual here) GroundFilter command. I've had no problem handling 40 million points (unclassified), so wouldn't expect an issue with 100 million.


This can be done with a filter using either Simple Morphological Filter (SMRF) or Progressive Morphological Filter (PMF) algorithms.


pdal ground --cell_size=5 --extract input.laz out-bare-earth.laz

Creates a bare earth compressed LAS file with a 5 ground unit cell size using PMF. (docs)

For more explanation see the Identifying ground returns using ProgressiveMorphologicalFilter segmentation tutorial.

More involved, using SMRF

A pipeline example that:

  • applies the SMRF filter, enlarges the cell size option to 2.0 (coordinate system units) and a 0.75 threshold
  • selects only the newly classified ground points (2 is the LAS standard value for ground)
  • writes selection to an uncompressed LAS output file (just change extension to .laz for compressed)

Command: pdal pipeline "classify-ground-smrf.json"

The JSON parameters file:

    "pipeline": [
            "cell": "2.0",
            "threshold": "0.75"

Extract above ground only

This example a) classifies into ground/not-ground, b) adds "Height Above Ground" attribute, and c) exports only points 2.0 (coordinate system units) above ground.

    "pipeline": [
            "type": "filters.assign",
            "assignment": "Classification[:]=0"
            "type": "filters.smrf"
            "type": "filters.hag"
            "type": "filters.range",
            "limits": "HeightAboveGround[2:]"

Adapted from Brad Chambers, https://lists.osgeo.org/pipermail/pdal/2017-July/001367.html

  • I have found that certain structural object geometries (eg., buildings) are identified quite well but morphological approaches perform quite poorly in forested areas, particularly with variable slopes. If the lidar data was acquired over a urban area I would certainly recommend MF but, other algorithms are much more effective given different physical settings. – Jeffrey Evans Nov 16 '17 at 15:28
  • @JeffreyEvans can you elaborate on what other algorithms you've found to be better in non-urban settings? (and perhaps which kinds of non-urban, e.g. forested, mountainous, ...) – matt wilkie Nov 16 '17 at 16:55

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.