Individual Tree Segmentation Algorithm
This functions is made to be used in segment_trees. It implements an algorithm for tree
segmentation based on the Silva et al. (2016) article (see reference). This is a simple method
based on seed + voronoi tesselation (equivalent to nearest neighbour). This algorithm is implemented
in the package rLiDAR
. This version is not the version from rLiDAR
. It is
code written from the original article by the lidR authors and is considerably (between 250
and 1000 times) faster.
silva2016(chm, treetops, max_cr_factor = 0.6, exclusion = 0.3, ID = "treeID")
chm |
RasterLayer. Image of the canopy. Can be computed with grid_canopy or read from an external file. |
treetops |
|
max_cr_factor |
numeric. Maximum value of a crown diameter given as a proportion of the tree height. Default is 0.6, meaning 60% of the tree height. |
exclusion |
numeric. For each tree, pixels with an elevation lower than |
ID |
character. If the |
Because this algorithm works on a CHM only there is no actual need for a point cloud. Sometimes the
user does not even have the point cloud that generated the CHM. lidR
is a point cloud-oriented
library, which is why this algorithm must be used in segment_trees to merge the result into the point
cloud. However, the user can use this as a stand-alone function like this:
chm = raster("file/to/a/chm/") ttops = find_trees(chm, lmf(3)) crowns = silva2016(chm, ttops)()
Silva, C. A., Hudak, A. T., Vierling, L. A., Loudermilk, E. L., O’Brien, J. J., Hiers, J. K., Khosravipour, A. (2016). Imputation of Individual Longleaf Pine (Pinus palustris Mill.) Tree Attributes from Field and LiDAR Data. Canadian Journal of Remote Sensing, 42(5), 554–573. https://doi.org/10.1080/07038992.2016.1196582.
Other individual tree segmentation algorithms:
dalponte2016()
,
li2012()
,
watershed()
Other raster based tree segmentation algorithms:
dalponte2016()
,
watershed()
LASfile <- system.file("extdata", "MixedConifer.laz", package="lidR") poi <- "-drop_z_below 0 -inside 481280 3812940 481320 3812980" las <- readLAS(LASfile, select = "xyz", filter = poi) col <- pastel.colors(200) chm <- grid_canopy(las, res = 0.5, p2r(0.3)) ker <- matrix(1,3,3) chm <- raster::focal(chm, w = ker, fun = mean, na.rm = TRUE) ttops <- find_trees(chm, lmf(4, 2)) las <- segment_trees(las, silva2016(chm, ttops)) #plot(las, color = "treeID", colorPalette = col)
Please choose more modern alternatives, such as Google Chrome or Mozilla Firefox.