Individual tree segmentation using Dalponte et al. (2016) algorithm (see reference).
This is a local maxima + growing region algorithm. It is based on the constraints proposed 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
efficiently. Consequently it is hundreds to millions 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 in separate functions.
lastrees_dalponte(las, chm, treetops, th_tree = 2, th_seed = 0.45,
th_cr = 0.55, max_cr = 10, extra = FALSE, ...)
An object of the class LAS
. If missing extra
is turned to TRUE
automatically.
RasterLayer. Image of the canopy. Can be computed with grid_canopy or grid_tincanopy or read it from an external file.
RasterLayer
or data.frame
containing the position of the
trees. Can be computed with tree_detection or read from an external file.
numeric. Threshold below which a pixel cannot be a tree. Default 2.
numeric. Growing threshold 1. See reference in Dalponte et al. 2016. A pixel is added to a region if its height is greater than the tree height multiplied by this value. It should be between 0 and 1. Default 0.45.
numeric. Growing threshold 2. See reference in Dalponte et al. 2016. A pixel is added to a region if its height is greater than the current mean height of the region multiplied by this value. It should be between 0 and 1. Default 0.55.
numeric. Maximum value of the crown diameter of a detected tree (in pixels). Default 10.
logical. By default the function classifies the original point cloud by reference
and return nothing (NULL) i.e. the original point cloud is automatically updated in place. If
extra = TRUE
an additional RasterLayer
used internally can be returned.
Supplementary options. Currently field
is supported to change the default name of
the new column.
Nothing (NULL), the point cloud is updated by reference. The original point cloud
has a new column named treeID
containing an ID for each point that refer to a segmented tree.
If extra = TRUE
algorithms return a RasterLayer
used internally.
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.
Other tree_segmentation: lastrees_li2
,
lastrees_silva
,
lastrees_watershed
, lastrees
# NOT RUN {
LASfile <- system.file("extdata", "MixedConifer.laz", package="lidR")
las = readLAS(LASfile, select = "xyz", filter = "-drop_z_below 0")
col = pastel.colors(200)
chm = grid_canopy(las, res = 0.5, subcircle = 0.3)
chm = as.raster(chm)
kernel = matrix(1,3,3)
chm = raster::focal(chm, w = kernel, fun = mean, na.rm = TRUE)
ttops = tree_detection(chm, 5, 2)
lastrees_dalponte(las, chm, ttops)
plot(las, color = "treeID", colorPalette = col)
# }
Run the code above in your browser using DataLab