v.lidar.edgedetection(1)

πŸ’… v.lidar.edgedetection β€” GRASS GIS User's Manual, bestie edition ✨

okay so real quick before anything else: this is v.lidar.edgedetection(1), a page from the GRASS GIS User's Manual, and it's about finding edges in your LiDAR points. Yes it's giving niche. Yes it's also iconic. Sit down, we're doing this 🫢


πŸŽ€ NAME πŸŽ€

v.lidar.edgedetection β€” Detects the object's edges from a LIDAR data set.

πŸ¦‹ KEYWORDS πŸ¦‹

vector, LIDAR, edges


✨ SYNOPSIS ✨

v.lidar.edgedetection
v.lidar.edgedetection --help
v.lidar.edgedetection [-e] input=name output=name  [ew_step=float]
[ns_step=float]   [lambda_g=float]   [tgh=float]   [tgl=float]
[theta_g=float]   [lambda_r=float]   [--overwrite]  [--help]
[--verbose]  [--quiet]  [--ui]

🚩 Flags

  • -e β€” Estimate point density and distance and quit. Like, it estimates point density and distance in map units for the input vector points within the current region extents, and then it dips. πŸ‘‹
  • --overwrite β€” Allow output files to overwrite existing files
  • --help β€” Print usage summary
  • --verbose β€” Verbose module output
  • --quiet β€” Quiet module output
  • --ui β€” Force launching GUI dialog

🌸 Parameters

  • input=name [required] β€” Name of input vector map. Or data source for direct OGR access.
  • output=name [required] β€” Name for output vector map
  • ew_step=float β€” Length of each spline step in the east-west direction. Default: 4 * east-west resolution
  • ns_step=float β€” Length of each spline step in the north-south direction. Default: 4 * north-south resolution
  • lambda_g=float β€” Regularization weight in gradient evaluation. Default: 0.01
  • tgh=float β€” High gradient threshold for edge classification. Default: 6
  • tgl=float β€” Low gradient threshold for edge classification. Default: 3
  • theta_g=float β€” Angle range for same direction detection. Default: 0.26
  • lambda_r=float β€” Regularization weight in residual evaluation. Default: 2

πŸ’– DESCRIPTION πŸ’–

okay so v.lidar.edgedetection is step one of three in the whole "let's filter some LiDAR data" saga. The filter's whole mission? Recognize and extract attached and detached objects β€” think buildings, bridges, power lines, trees, the whole cast of characters β€” so you can build a Digital Terrain Model. main character goal fr.

Specifically, this module detects the edge of each single feature sitting over the terrain surface of a LIDAR point surface. Here's the tea, step by step:

First of all, a bilinear spline interpolation with a Tychonov regularization parameter gets performed. The gradient is minimized, and that low Tychonov regularization parameter brings the interpolated functions as close as possible to the observations. (so cozy, so accurate πŸ’…)

Then bicubic spline interpolation with Tychonov regularization happens. But now the vibe flips: the curvature is minimized, and the regularization parameter is set to a high value.

For each point, an interpolated value is computed from the bicubic surface, and an interpolated gradient is computed from the bilinear surface. At each point, the gradient magnitude and the direction of the edge vector get calculated, and the residual between interpolated and observed values gets computed too.

Then two thresholds come into play on the gradient: a high one, tgh, and a low one, tgl. Here's the classification moment:

  • For each point, if the gradient magnitude is greater than or equal to the high threshold and its residual is greater than or equal to zero, it gets labeled as an EDGE point. πŸŽ‰
  • Similarly, a point is labeled as being an EDGE point if the gradient magnitude is greater than or equal to the low threshold, its residual is greater than or equal to zero, AND the gradient to two of eight neighboring points is greater than the high threshold.
  • Every other point? Classified as TERRAIN. periodt.

The length (in mapping units) of each spline step is defined by ew_step for the east-west direction and ns_step for the north-south direction.

The output will be a vector map in which points have been classified as TERRAIN, EDGE or UNKNOWN. This vector map should be the input of the v.lidar.growing module. (Yes bestie, it's a relay race. πŸƒβ™€οΈ)


πŸ“ NOTES πŸ“

In this module, an external table will be created, and it will be useful for the next module of the procedure of LiDAR data filtering. In this table, the interpolated height values of each point will be recorded. πŸ—‚οΈ

Also, points in the output vector map will be classified as:

TERRAIN (cat = 1, layer = 1)
EDGE (cat = 2, layer = 1)
UNKNOWN (cat = 3, layer = 1)

And the final result of the whole procedure β€” v.lidar.edgedetection, v.lidar.growing, v.lidar.correction β€” will be a point classification in four categories:

TERRAIN SINGLE PULSE (cat = 1, layer = 2)
TERRAIN DOUBLE PULSE (cat = 2, layer = 2)
OBJECT SINGLE PULSE (cat = 3, layer = 2)
OBJECT DOUBLE PULSE (cat = 4, layer = 2)

🌈 EXAMPLES 🌈

Basic edge detection

# last return points
v.lidar.edgedetection input=vector_last output=edge ew_step=8 ns_step=8 lambda_g=0.5

Complete workflow

# region settings (using an existing raster)
g.region raster=elev_lid792_1m
# import
v.in.pdal -r input=points.las output=points
v.in.pdal -r input=points.las output=points_first return_filter=first
# detection
v.lidar.edgedetection input=points output=edge ew_step=8 ns_step=8 lambda_g=0.5
v.lidar.growing input=edge output=growing first=points_first
v.lidar.correction input=growing output=correction terrain=only_terrain
# visualization of selected points
# zoom somewhere first, to make it faster
d.rast map=orthophoto
d.vect map=correction layer=2 cats=2,3,4 color=red size=0.25
d.vect map=correction layer=2 cats=1 color=0:128:0 size=0.5
# interpolation (this may take some time)
v.surf.rst input=only_terrain elevation=terrain
# get object points for 3D visualization
v.extract input=correction layer=2 cats=2,3,4 output=objects
πŸ–ΌοΈ Figure 1: Example output from complete workflow (red: objects, green: terrain)
πŸ–ΌοΈ Figure 2: 3D visualization of filtered object points (red) and terrain created from terrain points (gray)

πŸ“š REFERENCES πŸ“š

  • Antolin, R. et al., 2006. Digital terrain models determination by LiDAR technology: Po basin experimentation. Bolletino di Geodesia e Scienze Affini, anno LXV, n. 2, pp. 69-89.
  • Brovelli M. A., Cannata M., Longoni U.M., 2004. LIDAR Data Filtering and DTM Interpolation Within GRASS, Transactions in GIS, April 2004, vol. 8, iss. 2, pp. 155-174(20), Blackwell Publishing Ltd.
  • Brovelli M. A., Cannata M., 2004. Digital Terrain model reconstruction in urban areas from airborne laser scanning data: the method and an example for Pavia (Northern Italy). Computers and Geosciences 30 (2004) pp.325-331
  • Brovelli M. A. and Longoni U.M., 2003. Software per il filtraggio di dati LIDAR, Rivista dell'Agenzia del Territorio, n. 3-2003, pp. 11-22 (ISSN 1593-2192).
  • Brovelli M. A., Cannata M. and Longoni U.M., 2002. DTM LIDAR in area urbana, Bollettino SIFET N.2, pp. 7-26.
  • Performances of the filter can be seen in the ISPRS WG III/3 Comparison of Filters report by Sithole, G. and Vosselman, G., 2003.

πŸ‘€ SEE ALSO πŸ‘€

v.lidar.growing, v.lidar.correction, v.surf.bspline, v.surf.rst, v.in.pdal, v.in.ascii


πŸ‘‘ AUTHORS πŸ‘‘

Original version of program in GRASS 5.4: Maria Antonia Brovelli, Massimiliano Cannata, Ulisse Longoni and Mirko Reguzzoni

Update for GRASS 6.X: Roberto Antolin and Gonzalo Moreno


πŸ”₯ SOURCE CODE πŸ”₯

Available at: v.lidar.edgedetection source code (history)

Accessed: Saturday Jan 17 05:41:23 2026

Main index | Vector index | Topics index | Keywords index | Graphical index | Full index


and that's the whole page, bestie πŸ’– source code lives at the v.lidar.edgedetection source code (history), last peeked at Saturday Jan 17 05:41:23 2026, and the whole thing is Β© 2003-2025 GRASS Development Team, GRASS GIS 8.4.2 Reference Manual β€” running on GRASS 8.4.2, no cap. now go classify some edges, you got this πŸ¦‹βœ¨

πŸ“¦ where this page comes from