You finish a flight, run Metashape through dense cloud generation, and export a LAZ file with 80 million points. Every rooftop, every tree crown, every gravel access road, and every piece of equipment parked on the pad is mixed together in a single undifferentiated mass of XYZ coordinates. You need a bare-earth DTM for cut/fill volumes, but vegetation is in the way.
Point cloud classification photogrammetry is the process of assigning semantic labels — ground, vegetation, buildings — to individual points in a drone-derived dense cloud. Once classified, you can filter to ground-only points and interpolate an accurate DTM. Skip this step and your “terrain model” is actually a surface model of whatever happens to be sitting on the ground.
This article covers how classification works, why photogrammetry behaves differently from LiDAR, what each major tool actually does under the hood, and when photogrammetry classification is good enough versus when you need to rent a LiDAR sensor.
ASPRS Class Codes: The Standard Labels
Every LAS and LAZ file stores a class code integer on each point. The American Society for Photogrammetry and Remote Sensing (ASPRS) defines the standard codebook in the LAS 1.4 specification. These codes are universal across tools — a class-2 point from Metashape means the same thing as a class-2 point in ArcGIS Pro or PDAL.
The codes you will work with on most projects:
| Code | Class Name | Practical Meaning |
|---|---|---|
| 0 | Never Classified | Raw, unprocessed |
| 1 | Unassigned | Processed, no class assigned yet |
| 2 | Ground | Bare earth — used for DTM interpolation |
| 3 | Low Vegetation | Under ~20 in (0.5 m) — grass, crops |
| 4 | Medium Vegetation | ~20 in–6.6 ft (0.5–2 m) — shrubs |
| 5 | High Vegetation | Over 6.6 ft (2 m) — trees |
| 6 | Building | Roof surfaces, structures |
| 7 | Low Point / Noise | Below-ground outliers, sensor error |
| 9 | Water | Lake and river surfaces |
| 17 | Bridge Deck | Bridge surfaces, separated from ground |
| 18 | High Noise | Airborne returns, birds |
Vegetation height thresholds (classes 3, 4, 5) are measured from the classified ground surface — which is why you must classify ground first before vegetation classification is meaningful. When a fresh Metashape dense cloud exports, every point is typically class 1 (Unassigned). Some Pix4D exports are class 0. Either way, you are running classification yourself in post.
How Photogrammetry Differs from LiDAR for Classification
Understanding this single difference will save you from delivering unusable DTMs.
Canopy Penetration: The Hard Limit
LiDAR fires active laser pulses. A single pulse can produce multiple returns: first return off the canopy, intermediate returns through gaps in foliage, and a last return from the ground. In forested terrain with reasonable canopy gaps, 10–30% of pulses reach bare earth — enough to interpolate a DTM.
Photogrammetry works from reflected light and image matching. Structure from Motion (SfM) and multi-view stereo reconstruction create points only where cameras can see a surface. Under any vegetation — even tall grass — photogrammetry cannot reconstruct what is hidden from the camera lens. The ground beneath a tree canopy is simply absent from a photogrammetry point cloud. The nearest points are the crown surface.
Any DTM generated from photogrammetry in vegetated terrain is not a terrain model. It is a surface model of whatever is on top.
Density and Edge Noise
Photogrammetry at typical drone survey overlap (75/75 or 80/75) produces 100–1,000+ points per square foot — denser than most drone LiDAR systems. That density advantage disappears under canopy because all those points are at the canopy surface.
Photogrammetry clouds also carry more noise along object edges — where image matching is geometrically ambiguous — and in low-texture areas like water, asphalt, and uniform painted rooftops. LiDAR transitions more cleanly at building edges. For photogrammetry clouds, a noise-filtering pass before ground classification is not optional on production work.
DTM Accuracy by Terrain Type
Peer-reviewed benchmarks give you a practical baseline for setting client expectations:
- Open flat terrain, less than 8 in vegetation: Photogrammetry DTM RMSE ~5–7 in with RTK/PPK and GCPs. LiDAR achieves ~4–5 in. The gap is small. Photogrammetry is acceptable.
- Rolling terrain with low grass, less than 12 in: Photogrammetry RMSE ~6–10 in. Parameter tuning required.
- Medium vegetation, more than 24 in tall: Photogrammetry RMSE degrades to ~14 in. LiDAR holds ~4 in. That is a 3x gap. Not reliable for survey-grade deliverables.
- Dense shrubs or crops, 1–6 ft tall: RMSE can exceed 18 in. Large areas will have no real ground points.
- Tree canopy: Zero usable ground points from photogrammetry. Do not attempt.
The honest rule: if you fly the site and can see dirt in the imagery, classification will work. If you see green, you need LiDAR — or you need to document the limitation explicitly in your deliverable.
Tool-by-Tool Walkthrough
Metashape — Built-In ATIN Classification
Metashape’s ground classifier uses an Adaptive Triangulated Irregular Network (ATIN) algorithm — not CSF. This matters because the parameter names only make sense in an ATIN context.
The algorithm works in two stages. First, it divides the cloud into grid cells and finds the lowest point in each cell to build a coarse seed TIN. Then it iteratively adds more points to the ground class if they satisfy two conditions: within Max Distance of the current TIN surface, and the angle between the TIN face and the candidate point is within Max Angle.
Key parameters and how to tune them:
| Parameter | Default | When to Adjust |
|---|---|---|
| Max Angle (°) | 15 | Increase to 20–30° for steep terrain |
| Max Distance (m) | 1.0 | Increase for rough, uneven terrain |
| Max Terrain Slope (°) | 45 | Lower to reduce vegetation bleeding into ground class |
| Cell Size (m) | 50 | Set to match the largest gap with no ground — e.g., a large building footprint |
| Erosion Radius (m) | 0 | Set to 1–2 m to reduce building/tree stump artifacts |
The workflow: Tools → Point Cloud → Classify Ground Points. After running, inspect in 3D view with ground points highlighted. Then Model → Build DEM, Source: Point Cloud, Classes: Ground (class 2).
Common issues on photogrammetry data: tall grass bleeding into the ground class (increase Max Terrain Slope or tighten Max Distance), and building walls classified as ground (set Erosion Radius to 2 m).
CloudCompare — CSF Plugin (Free)
CloudCompare ships with the Cloth Simulation Filter (CSF) as a bundled plugin. This is the most accessible free option for ground classification.
CSF is a physics simulation: the point cloud is flipped upside down, a virtual cloth is dropped onto the inverted surface, and gravity plus internal spring tension causes the cloth to settle against the terrain. Points within a set distance of the settled cloth are ground; everything else is non-ground.
Key parameters:
| Parameter | Default | What It Controls |
|---|---|---|
| Cloth Resolution | 0.5 m | Grid spacing — smaller captures finer terrain detail |
| Classification Threshold | 0.5 m | Distance cutoff: points within this distance = ground |
| Rigidness | 2 (Medium) | Cloth stiffness: 1=rugged terrain, 2=default, 3=flat only |
| Slope Processing | On | Leave enabled for photogrammetry |
| Post-processing | On | Fills density gaps in cloth |
Workflow: load your LAZ, select the cloud, Plugins → CSF Filter, set parameters, run. For survey delivery with standard ASPRS codes, you will need to reclassify or push the result through LAStools or PDAL to write class-2 codes. For visual QA or one-off work, CloudCompare CSF is fine as-is.
LAStools — Production Pipeline
LAStools (rapidlasso GmbH) is the industry-standard toolkit for production classification. The standard three-step workflow:
Step 1 — lasground classifies ground vs. non-ground using the Axelsson progressive TIN densification algorithm. For photogrammetric clouds, tune the -bulge parameter. Use -nature preset for natural terrain, -town for urban areas:
lasground -i survey.laz -o survey_ground.laz -nature
Step 2 — lasheight computes height above ground for every non-ground point. Required before vegetation heights can be determined:
lasheight -i survey_ground.laz -o survey_height.laz
Step 3 — lasclassify assigns buildings (class 6) and high vegetation (class 5) among elevated non-ground points. Minimum reliable density for building detection: ~2 points/m² — photogrammetry routinely delivers 100–1,000+:
lasclassify -i survey_height.laz -o survey_classified.laz
Licensing. LAStools is not open source. lasground, lasclassify, and lasheight require a commercial license for paid or government work. Without a license, outputs are degraded. Verify current pricing at rapidlasso.de before building a deliverable workflow around it.
ArcGIS Pro — Classify LAS Ground
ArcGIS Pro’s Classify LAS Ground tool (3D Analyst extension) offers four detection methods: Standard, Conservative, Aggressive, and Recover Ridges. Standard is the right starting point for most photogrammetry inputs. After running Standard, use Recover Ridges to pick up ridge lines the initial pass missed.
Classify LAS By Height provides vegetation height classification (classes 3/4/5) after ground is established, analogous to the lasheight + lasclassify pipeline in LAStools.
ArcGIS Pro also supports deep learning-based classification via Classify a Point Cloud with Deep Learning. For complex urban scenes, deep learning outperforms rule-based methods. Requires 3D Analyst extension — confirm your client’s licensing before specifying this workflow.
See also: AI Point Cloud Processing for a full breakdown of deep learning classification options.
PDAL — Open-Source Scripted Pipelines
PDAL (Point Data Abstraction Library) is a BSD-licensed command-line and Python library for point cloud processing. For ground classification, the recommended filter is filters.smrf. A complete pipeline:
{
"pipeline": [
"input.laz",
{
"type": "filters.outlier",
"method": "statistical",
"mean_k": 12,
"multiplier": 2.2
},
{
"type": "filters.smrf",
"ignore": "Classification[7:7]",
"slope": 0.2,
"window": 16,
"threshold": 0.45,
"scalar": 1.2
},
{
"type": "filters.range",
"limits": "Classification[2:2]"
},
"ground_only.laz"
]
}
Run it with:
pdal pipeline classify_ground.json
PDAL is free, cross-platform, and integrates cleanly with Python and ODM/WebODM post-processing scripts. Steeper learning curve than Metashape or CloudCompare, but the right tool for automated batch work.
Decision Framework: Which Tool to Use
Use Metashape’s built-in classifier if:
- Your project is already running through Metashape
- The site is open or lightly vegetated (less than 30% canopy cover)
- You need ground-only classification for DTM generation
- You do not need formal building or vegetation class codes in the deliverable
Use CloudCompare + CSF if:
- You need a free option for QA or one-off classification
- You want to visually verify ground separation before committing to a pipeline
- You do not need ASPRS-coded output for delivery
Use LAStools if:
- You need complete classification: ground, vegetation, and buildings
- You are running production volume with batch automation
- Your deliverable specifies LiDAR Base Specification-compliant class codes
- You have a commercial license
Use ArcGIS Pro if:
- Your final deliverable workflow lives inside ArcGIS Pro anyway
- Your client or agency requires an Esri-based workflow
Use PDAL if:
- You are building a scripted, automated pipeline
- You need open-source only (no commercial license budget)
- You are integrating with ODM, WebODM, or Python processing scripts
When photogrammetry classification is not sufficient:
- Any significant tree canopy exists over the survey area
- Deliverable spec requires survey-grade vertical accuracy below 3-inch RMSE
- Project involves flood modeling, stormwater design, or coastal elevation
- USGS 3DEP-compliant deliverable is required
For a detailed comparison of when to choose LiDAR over photogrammetry entirely, see LiDAR vs. Photogrammetry.
Accuracy Expectations: What to Document and Deliver
Set these expectations with clients before you fly, not after you process.
On a cleared construction site or agricultural field with less than 8 inches of vegetation, RTK/PPK photogrammetry with GCPs will produce a DTM with RMSE around 5–7 inches. That is adequate for stockpile volumes, cut/fill estimates, and 1-foot contour intervals. On rolling terrain with low grass, RMSE typically runs 6–10 inches — adequate for 2-foot contours and general drainage analysis, but requiring visual QA of the ground mask.
Once vegetation exceeds 24 inches in height, RMSE climbs toward 14 inches and higher. At that point you are interpolating across large areas with no real ground data underneath. Document it explicitly rather than delivering a DTM that looks authoritative but is not.
For checkpoint validation, use a minimum of five independent check points (not GCPs used in processing) spread across the site, including areas near vegetation and structure edges. Record: total points classified as ground, what percentage of the cloud that represents, RMSE at checkpoints, and known areas of limitation.
Frequently Asked Questions
What ASPRS class code is ground in a LAS file?
Class 2. This is universal across all tools and the ASPRS LAS 1.4 specification. When filtering for DTM generation, filter for Classification == 2. Low vegetation is class 3, medium vegetation class 4, high vegetation class 5, buildings class 6.
Does Metashape use CSF for ground classification?
No. Metashape uses an ATIN (Adaptive Triangulated Irregular Network) algorithm. CSF is available as a third-party Python script, but the native classifier is ATIN. Confusing the two leads to tuning the wrong parameters — Max Angle and Max Distance are ATIN parameters, not CSF parameters.
Can I get a usable DTM from photogrammetry under trees?
No. Photogrammetry cannot see through canopy. Every point under a tree crown is on the canopy surface, not the ground. For any project with significant tree cover, you need LiDAR. There is no workaround.
Do I need a license to use LAStools for client work?
Yes. lasground, lasheight, and lasclassify all require a commercial license for paid or government work. Without a license, outputs are degraded with injected noise and point-count caps. PDAL is a free alternative that handles the same classification tasks with no licensing restrictions.
What is the difference between a DTM and a DSM?
A DSM (Digital Surface Model) represents the top surface of everything — canopy, buildings, vehicles. A DTM (Digital Terrain Model) represents bare earth only. Classification is the step that separates the two: classify ground points (class 2), then interpolate the DTM from ground-only.
How do I classify a photogrammetry point cloud in PDAL without ArcGIS or Metashape?
Use filters.smrf in a PDAL JSON pipeline. Run a filters.outlier pass first to clean up photogrammetry edge noise, then run SMRF with slope: 0.2, window: 16, threshold: 0.45. PDAL is free, cross-platform, and handles batch processing well.