hamraz2016: Individual Tree Segmentation Algorithm

View source: R/algo-hamraz.R

hamraz2016R Documentation

Individual Tree Segmentation Algorithm

Description

This functions is made to be used in segment_trees. It implements an algorithms for tree segmentation based on paper written by Hamraz et al. (2016). See references and details.

Usage

hamraz2016(
  nps = 0.25,
  th = 5,
  MDCW = 1.5,
  epsilon = 5,
  CLc = 0.8,
  Oc = 2/3,
  CLs = 0.7,
  Os = 1/3,
  gap_sensitivity = 6L,
  R = 15.24,
  filter_profiles = TRUE
)

Arguments

nps

numeric. Nominal point spacing (see reference page 533 section 2)

th

numeric. Minimal height. Point below this threshold are not condisered for the segmentation (see reference page 534 section 2)

MDCW

numeric. Minimum detectable crown width (page 534 section 2)

epsilon

numeric. Small deviation from vertical (page 535 section 2.2.2)

CLc

numeric. Crown ratio of a narrow cone-shaped crown (page 535 equation 3)

Oc

numeric. Crown radius reduction due to the overlap assuming the narrow cone-shaped tree is situated in a dense stand (page 535 equation 3)

CLs

numeric. Crown ratio of a sphere-shaped crown (page 535 equation 4)

Os

numeric. Crown radius reduction due to the overlap within a dense stand for the sphere-shaped tree (page 535 equation 4)

gap_sensitivity

integer. In the original article, page 535 section 2.2.1, gaps are detected using six times the interquartile range of square root distance between consecutive points. This paramter control this value. Default is 6.

R

numeric. Maximum horizontal distance of vertical profiles (page 535 sectioh 2.1). 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.

filter_profiles

logical. This is an addition to the original method to filter dummy profiles (see details)

Details

This function has been written by the lidR authors from the original article. We made our best to implement as far as possible exactly what is written in the original paper but we cannot affirm that it is this exact original algorithm.

Also it is important to notice that we have never been able to segment tree properly with this method. The important sensitivity to minor deviation as well as the great number of difficultly parametrizable parameter lead us to a method that we are not able to use ourselves.

Also, minor variations were introduced to fix some issues that were not adressed in the original paper. Because the methods described in section 2.2 of the original article appear extremely sensitive to many minor deviations, we introduced an optionnal additionnal step to clean the profiles used to build the convex hull. When filter_profiles = TRUE, profiles that discribe a crown radius smaller than 2*nps (basically radius that are close to 0) are removed and the convex hull is build considering the profiles that describe a crown radius comprise between the 10th and the 90th of the radiuses found. This enable to remove outliers and reduce dummy segmentation but anyway we were not able to segment the tree properly with this method.

As a conclusion this algorithm might be considered as a free and open source code provided to be improved by the community. One can check and study the sources and find potential improvement.

Also the current implementation is known to be slow.

Author(s)

Jasmin Siefert & Jean-Romain Roussel

References

Hamraz, H., Contreras, M. A., & Zhang, J. (2016). A robust approach for tree segmentation in deciduous forests using small-footprint airborne LiDAR data. International Journal of Applied Earth Observation and Geoinformation, 52, 532–541. https://doi.org/10.1016/j.cageo.2017.02.017

See Also

Other individual tree segmentation algorithms: ptrees()

Other point-cloud based tree segmentation algorithms: ptrees()

Examples

## Not run: 
LASfile <- system.file("extdata", "MixedConifer.laz", package="lidR")
las <- readLAS(LASfile, select = "xyz", filter = "-drop_z_below 0")
col <-  pastel.colors(200)

las <- segment_trees(las, hamraz2016())
plot(las, color = "treeID", colorPalette = pastel.colors(200))

## End(Not run)

Jean-Romain/lidRplugins documentation built on Feb. 8, 2023, 5:39 a.m.