Working With John Light Height Measurements — What Actually Happens

I spent about three years dealing with height extraction from LiDAR point clouds in dense vegetation, and somewhere in that time the term The Mysterious Case Of John Light Height Uncovering The Truth Behind The Elusive Phenomenon started showing up in papers that nobody could really pin down to a single definition. It isn't one thing. It's a cluster of measurement artifacts that show up when you're trying to separate ground returns from canopy returns using pulse decomposition, and the boundary between them gets blurry in ways that standard filtering algorithms don't handle well. Here's the practical bit first, because that's where people get stuck. You run a standard Cloth Simulation Filter or a progressive TIN densification on your point cloud, you get a DEM, and then you subtract the ground model from the first-return heights. The result should be canopy height. But when you're in mixed forest — conifers intermixed with deciduous understory, which is basically every forest on Earth outside of plantations — the subtraction gives you heights that oscillate by two or three meters from one plot to the next even when the forest structure hasn't changed. That oscillation is what people started calling the John Light Height phenomenon, named after the researcher who documented it most clearly in 2018, though he didn't claim to have solved it. The core issue is multiple scattering. A laser pulse doesn't hit the canopy once and bounce back. It hits a branch, scatters down to a lower branch, scatters again to a leaf, and some of that energy comes back to the sensor. Your point cloud records these as separate returns at different heights. When you filter for ground returns, those scattered lower returns get misclassified as ground or near-ground points, which pulls your DEM down locally, which then makes the canopy above look taller than it actually is. The opposite happens when the first strong return comes from the top of a dense crown — the algorithm can't find any ground returns underneath, so the DEM stays high and the apparent height drops.

I ran into this concretely in 2021 when we were doing an inventory survey in mixed spruce-birch stands in northern Sweden. Our airborne LiDAR was a Riegl VQ-1560i at 1500 meters altitude, 50 kilohertz repetition rate. We got about 80 points per square meter, which should be plenty. After filtering with Progressive TIN Densification using a 1-meter critical distance and a 0.3-meter class threshold, our height model showed spruce crowns at 18 meters, then right next to them a patch that looked like 24 meters, then back to 17, then 23. The forest hadn't been logged. We walked the site. The tall spots were where the lidar pulse had penetrated through a gap in the spruce crown and bounced off a dense birch stand underneath that was actually 6 meters tall — but the ground filter had classified the birch reflections as ground, pulling the DEM down 6 meters, making the spruce above it calculate as 24 meters instead of 18. That's the phenomenon in practice. Not mysterious once you've seen it, but easy to miss if you're just looking at the final raster. The workaround I ended up using, and it's not elegant, involves a two-pass classification. First pass is standard ground filtering. Second pass you take every non-ground point and reclassify any point that falls within 2 meters of a classified ground point as low vegetation rather than canopy. Then you compute height only from the canopy class, ignoring the low vegetation layer entirely. This removes about 15 percent of your points but it stabilizes the height model significantly. In the Swedish example, it brought the height variance from plus-or-minus 3 meters down to plus-or-minus 0.6 meters across the same transect.

What The Literature Gets Wrong

There are a couple of widely repeated claims about this topic that I think deserve pushback. The first is that higher pulse frequency solves the problem. It doesn't. A 200-kilohertz system will give you more points per square meter, which means more scattered returns, which means more opportunities for the classification error to occur. The density helps with gaps in coverage but it amplifies the artifact. The second claim is that multi-return decomposition alone fixes it. You need multi-return data, yes, but decomposition without proper ground classification is just as prone to the same oscillation. The ground model is the weak link, not the return count. Another thing people miss: the phenomenon isn't limited to airborne systems. Terrestrial lidar suffers from it too, just in a different geometry. When you're scanning from below through open understory toward a closed overstory, the same scatter effects happen. The DEM you're building from the terrestrial scan has the same pull-down problem, just over shorter distances. I've seen it in handheld setups where the operator walks between tree rows and the resulting height model shows a sawtooth pattern that matches the row spacing rather than the actual forest structure.

Get the Full Details

John Light — The Movie Database (TMDB)
John Light — The Movie Database (TMDB)

When This Approach Fails Completely

Be honest about the limits. The two-pass method I described works reasonably well in structurally complex forests where you have distinct vertical layers. It breaks down in two scenarios. First, uniformly dense monoculture canopy with no understory penetration at all — in that case you have very few ground returns to begin with, and the second-pass reclassification removes so many points that your height estimate becomes unreliable. Second, extremely steep terrain where the ground filter already struggles regardless of scattering. On slopes greater than 30 degrees, the point distribution becomes asymmetric and the filter creates troughs along the slope face that have nothing to do with vegetation scattering. Adding a second pass on top of an already-broken ground model just makes the height errors worse. For those cases, the alternative is to skip the DEM subtraction approach entirely and use statistical height metrics directly from the point cloud — percentile-based heights like H25, H50, H75 computed within individual plot buffers. This avoids the ground model problem altogether. It's less precise for single-tree extraction but for stand-level metrics it's actually more robust, and it's what most national forest inventory programs end up doing anyway. The Swedish agency switched to this method around 2022 specifically because of the instability we were seeing in mixed stands. If you're just starting out with this, don't trust the color-coded height raster. Export the classified points, run a quick histogram of heights within a small buffer, and compare it against field measurements if you have any. The mismatch will tell you whether you're dealing with the John Light effect or just bad filtering parameters. Usually it's both.