Skip to content

Sylva

NOTE: This software is still in ALPHA development.

Terrestrial (TLS) and airborne (ALS) laser scanning processing for forest ecology and remote sensing. A Rust core (the sylva-rs crate) does the work; Python gets a numpy-friendly API (import sylva) and a sylva command.

pip install maturin && maturin develop --release
import sylva
from sylva import ground, trees

cloud = ground.classify_ground_csf(sylva.read("plot.laz"))
cloud = ground.normalize_height(cloud, ground.make_dtm(cloud, resolution=0.5))
stems = trees.detect_stems(cloud)                  # positions and DBH
labels = trees.segment_trees(cloud, stems)         # tree_id per point

What is in it

Module What it does
sylva.io LAS/LAZ (typed extra bytes, CRS), PLY (incl. raycloudtools ray clouds), XYZ/CSV/PTS, RIEGL .rxp via RiVLib and .rdbx via librdb, RiSCAN project parsing
sylva.geo.coords translation, rotation, recentring, reprojection between CRSs, applying transform files to many scans
sylva.filters voxel / random / Poisson-disk subsampling, box & cylinder crops, statistical & radius outlier removal, PCA normals, planarity, Euclidean clustering, kNN
sylva.ground Cloth Simulation Filter and Progressive Morphological Filter ground classification, DTM (lowest point, TIN, natural neighbour or IDW), height normalisation, CHM
sylva.geo.interpolate attributes carried between clouds, grids from points (IDW, TIN, natural neighbour), rasters sampled onto points
sylva.geo.masks masks and crops by polygons, rasters, attribute expressions and distance to another cloud
sylva.trees RANSAC circle fitting, stem detection & DBH, basal area, taper profiles, graph-based tree segmentation, tree heights, crown metrics
sylva.canopy voxel grids, contact-frequency PAD profiles, zenith-ring gap fraction, hinge/Miller LAI, ray-traced density grids from pulse data
sylva.voxels ray-traced voxels (port of raycloudtools rayvoxel): echo-weighted free / potential path lengths, FPL / PPL / transmittance / Bailey attenuation, analytic or estimated leaf-angle G, PAD / LAD / WAD, occlusion, sub-voxel exploration, QSM wood volume, .vox export
sylva.registration Kabsch, point-to-point / point-to-plane (trimmed) ICP, scan merging
sylva.coreg marker-free coregistration of scan positions from the trees and the ground, with reflectors where present, and a report of the stem agreement
sylva.qsm cylinder fitting, geodesic skeletonisation, cylinder QSMs with volumes and branch orders, a QSM for every tree of a plot, buttress meshes, _trees.txt export
sylva.change change between two epochs of a plot: alignment, tree matching and increments, plot summaries, point change (C2C, M3C2, DEM of difference, voxel occupancy), QSM change, each labelled trusted or not
sylva.als airborne lidar over tiled areas: catalogues and buffered chunks, ground, DTM, CHM, normalisation, filtering, retiling and thinning
sylva.als.metrics area-based metrics (the standard height, intensity and return-number set, cover, gap fraction) as rasters or plot tables
sylva.als.trees tree tops, crowns (watershed, Dalponte 2016, Li 2012), crown outlines and labelled tiles
sylva.als.canopy pulses from the flight trajectory, gap-fraction and PAD profiles corrected for beam angle, ray-traced voxels
sylva.fusion TLS and ALS together: a plot registered on a survey, stems linked to airborne trees, merged clouds and plant area profiles, plot values upscaled with leave-one-out checks
sylva.waveform LAS wave packets and PulseWaves, Gaussian decomposition into echoes, waveforms to pulses
sylva.Shots pulse-centric data (origin, direction, CSR echoes) for ray-based metrics, with a compact Parquet file format that stores misses without far points and streams into the voxeliser
sylva.leaves graph-based leaf/wood separation, leaf angle distributions, leaf area density from points or voxels, leaf meshes placed on a QSM
sylva.quality scan noise and per-scan registration offsets measured on tree stems
sylva.synthetic small synthetic trees, plots, scans, repeat surveys, airborne flights and waveforms with known answers, for examples and tests

Where to start

  • Segfix: a GUI for correcting the instance segmentation of a plot; it reads and writes the tree_id column Sylva produces, -1 and all (how).
  • raycloudtools: ray clouds, which sylva.read and Shots.from_ray_cloud accept.
  • Everything Sylva ports or takes influence from is cited on the references page.

Author and licence

Tim Devereux, The University of Queensland.

Free software under the GNU General Public License v3.0 or later: you may use, study, change and share it, and anything you distribute that builds on it carries the same licence. See the LICENSE file in the repository.

Cite it as: Devereux, T. (2026). Sylva: terrestrial and airborne laser scanning processing for forest ecology (version 0.2.1) [Computer software]. The University of Queensland. https://github.com/UQ-EORC/Sylva

@software{sylva,
  author       = {Devereux, Tim},
  title        = {Sylva: terrestrial and airborne laser scanning processing
                  for forest ecology},
  year         = {2026},
  version      = {0.2.1},
  organization = {The University of Queensland},
  url          = {https://github.com/UQ-EORC/Sylva}
}