Become an expert in R — Interactive courses, Cheat Sheets, certificates and more!
Get Started for Free

watershed

Individual Tree Segmentation Algorithm


Description

This function is made to be used in segment_trees. It implements an algorithm for tree segmentation based on a watershed or a marker-controlled watershed.

  • Simple watershed is based on the bioconductor package EBIimage. You need to install this package to run this method (see its github page). Internally, the function EBImage::watershed is called.

  • Marker-controlled watershed is based on the imager package and has been removed because imager is an orphaned package.

Usage

watershed(chm, th_tree = 2, tol = 1, ext = 1)

mcwatershed(chm, treetops, th_tree = 2, ID = "treeID")

Arguments

chm

RasterLayer. Image of the canopy. Can be computed with grid_canopy or read from an external file.

th_tree

numeric. Threshold below which a pixel cannot be a tree. Default is 2.

tol

numeric. Tolerance see ?EBImage::watershed.

ext

numeric. see ?EBImage::watershed.

treetops

SpatialPointsDataFrame. Can be computed with find_trees or read from an external shapefile.

ID

character. If the SpatialPointsDataFrame contains an attribute with the ID for each tree, the name of this column. This way, original IDs will be preserved. If there is no such data trees will be numbered sequentially.

Details

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 = watershed(chm)()

See Also

Other individual tree segmentation algorithms: dalponte2016(), li2012(), silva2016()

Other raster based tree segmentation algorithms: dalponte2016(), silva2016()

Examples

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(250)

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)
las <- segment_trees(las, watershed(chm))

plot(las, color = "treeID", colorPalette = col)

lidR

Airborne LiDAR Data Manipulation and Visualization for Forestry Applications

v3.1.2
GPL-3
Authors
Jean-Romain Roussel [aut, cre, cph], David Auty [aut, ctb] (Reviews the documentation), Florian De Boissieu [ctb] (Fixed bugs and improved catalog features), Andrew Sánchez Meador [ctb] (Implemented wing2015() for segment_snags()), Bourdon Jean-François [ctb] (Contributed to Roussel2020() for track_sensor()), Gatziolis Demetrios [ctb] (Implemented Gatziolis2019() for track_sensor())
Initial release
2021-03-11

We don't support your browser anymore

Please choose more modern alternatives, such as Google Chrome or Mozilla Firefox.