Individual tree segmentation

Individual tree segmentation with several possible algorithms (see details). The function attributes to each point of the point cloud a number identifying the detected tree the point comes from (treeID column). By default the classification is done at the point cloud level. However, with some algorithms it is possible to return a raster image of the classification. There are currently 3 algorithms implemented. See relevant sections.

lastrees(.las, algorithm, image = NULL, ..., extra = FALSE)

An object of the class LAS


character. The name of an algorithm. Can be "dalponte2016", "watershed" or "li2012" (see sections relevant to each algorithm).


RasterLayer. Image of the canopy if the algorithm works on a canopy surface model. But some algorithms work on the raw point cloud (see relevant sections). You can compute it with grid_canopy or grid_tincanopy or read it from external file.


parameters for the algorithms. These depend on the algorithm used (see details about the algorithms)


logical. By default the function works at the point cloud level and returns nothing. If extra = TRUE the function can return a RasterLayer or a list of 2 RasterLayers with the positions of the local maxima and a map of the crowns, depending on the algorithm used.


Nothing, the point cloud is updated by reference. If extra = TRUE, "dalponte2012" returns two RasterLayers, "watershed" returns one RasterLayer and "li2012" does not support the extra parameter.

Dalponte 2016

This is the algorithm developed by Dalponte and Coomes (see references). This algorithm exists in the package itcSegment. This version is identical to the original but with superfluous code removed and rewritten in C++. Consequently it is 6 times faster. Note that this algorithm strictly performs a segmentation while the original method as implemented in itcSegment and described in the manuscript also performs a pre- and post-process when these tasks are expected to be done by the user. The names of the parameters are the same as those in Dalponte's itcSegment package. Dalponte's algorithm is a canopy surface model-based method. An image of the canopy is expected.


Size (in pixels) of the moving window used to the detect the local maxima. It should be an odd number larger than 3. Default 3


Growing threshold 1. It should be between 0 and 1. Default 0.45


Growing threshold 2. It should be between 0 and 1. Default 0.55


Maximum value of the crown diameter of a detected tree (in meters). Default 10


Digital number value below which a pixel cannot be a local maxima. Default 2


This method relies on the watershed segmentation method. It is based on the bioconductor package EBIimage. You need to install this package to run this method (see its github page). The Watershed algorithm is a canopy surface model-based method. An image of the canopy is expected.


Numeric. Number value below which a pixel cannot be a crown. Default 2


Numeric. see ?EBImage::watershed


Numeric. see ?EBImage::watershed

Li 2012

This method is an implementation of the Li et al. (see references) algorithm made by lidR author. It may have some differences compared with the original method due to potential mis-interpretation of the Li et al. manuscript. This method works at the point cloud level. An image of the canopy is not expected.


Numeric. Threshold number 1. See reference page 79. Default is 1.5


Numeric. Threshold number 2. See reference page 79. Default is 2


Numeric. Maximum radius of a crown. Any value greater than a crown is good because this parameter does not affect the result. However, it greatly affects the computation speed. The lower the value, the faster the method. Default is 10.

The current implementation is known to be slow. Improvements are possible in future package versions.


Dalponte, M. and Coomes, D. A. (2016), Tree-centric mapping of forest carbon density from airborne laser scanning and hyperspectral data. Methods Ecol Evol, 7: 1236<U+2013>1245. doi:10.1111/2041-210X.12575 Li, W., Guo, Q., Jakubowski, M. K., & Kelly, M. (2012). A new method for segmenting individual trees from the lidar point cloud. Photogrammetric Engineering & Remote Sensing, 78(1), 75-84.

  • lastrees
LASfile <- system.file("extdata", "Tree.laz", package="lidR")
las = readLAS(LASfile, XYZonly = TRUE, filter = "-drop_z_below 0")

# compute a canopy image
chm = grid_canopy(las, res = 0.5, subcircle = 0.1, na.fill = "knnidw", k = 4)
chm = as.raster(chm)

# smoothing post-process (e.g. 2x mean)
kernel = matrix(1,3,3)
chm = raster::focal(chm, w = kernel, fun = mean)
chm = raster::focal(chm, w = kernel, fun = mean)
raster::plot(chm, col = height.colors(50)) # check the image

# segmentation
lastrees(las, "dalponte2016", chm, th = 5)

# plot points that actually are trees
trees = lasfilter(las, !
plot(trees, color = "treeID", colorPalette = random.colors(100))
# }
Documentation reproduced from package lidR, version 1.3.0, License: GPL-3

Community examples

Looks like there are no examples yet.