Skip to content

Segment individual trees

Separate a point cloud containing many trees into individual trees, giving every point a per-tree instance ID. Two methods are available, both on the CPU (no GPU required):

  • TreeIso (terrestrial) — a cut-pursuit graph method that builds trees up from stems and branches. Use it for ground-based scans where trunks are visible.
  • Canopy height (airborne) — finds each treetop in a canopy height model and splits the canopy between them. Use it for airborne and drone scans, and for dense canopies where TreeIso merges neighboring trees.

Choose a method

Pick the method in the panel's Method list. The rule of thumb is what can the scan see?

The scan shows… Use
Trunks and branches (terrestrial / mobile laser scanning) TreeIso
Mostly crown tops, few or no trunks (airborne / drone) Canopy height
Crowns that touch or interlock, and TreeIso returns several trees per instance Canopy height

TreeIso groups the cloud by where its stems and branches are, so on an airborne scan of a closed canopy it has almost nothing to separate touching crowns with, and it merges them — typically five to ten trees per instance. No TreeIso setting fully fixes that. Canopy height finds trees where such a scan does see them: at the tops of the crowns. How each method works is on Tree segmentation methods.

When to use this

  • Your scan covers a forest plot, orchard row, or any scene with more than one tree, and you want to isolate each tree.
  • You need per-tree point sets for downstream analysis (height, crown, skeleton) or to export each tree separately.

Before you start

Both methods isolate above-ground tree structure, so deal with the ground first with Segment ground points. You have two options:

  • Remove the ground points, or
  • Label them (run ground segmentation and keep the labeled cloud without deleting the ground). When the cloud carries a ground_class label, Segment Trees automatically excludes the ground points — only the plant points are segmented, and the ground keeps tree ID 0 ("Unassigned"). Canopy height also uses the labeled ground points as its terrain model; on a ground-removed cloud it uses the lowest returns instead.

If the cloud has never been through Ground Segmentation, the completion message reminds you (the run still completes). The reminder is based only on that history, not on the points, so it also appears for a file whose ground was removed before import; ignore it in that case. For Canopy height the reminder matters most: ground points under a crown are counted as part of that tree.

Steps

  1. Import your scan (see Import & export) and, if needed, run Segment ground points — either keep the non-ground cloud or keep the labeled cloud (the ground is excluded automatically).
  2. Select the cloud (or clouds) in the scan list.
  3. Open the Segment Trees tool from the toolbar (the trees/forest icon in the Tools › Segmentation group) or the command palette (Cmd/Ctrl-K → "Segment Trees"). Under Clouds, the panel lists every point cloud in the scene with the ones you had selected checked; check or uncheck them there (see Segment several clouds).
  4. Choose the Method (see Choose a method). For Canopy height, the settings are:

    • Crown scale (m) — roughly the width of the smaller crowns in the stand. It is not the distance between trunks: in an open stand the best value is well below the spacing. It is the main setting and it sizes everything else. Default 2.5, which suited every stand it was checked on, planted or natural (see Tree segmentation methods). Tune it by what you see: lower it if neighboring trees come out as one, raise it if one crown is split into several. If unsure, err low — too small splits crowns, which is easy to see; too large merges trees, which is easy to miss.
    • Min tree height (m) — canopy lower than this above the ground is not a tree and stays unassigned. Default 2.0.
    • CHM cell (m) — grid size of the canopy height model. Leave it empty (auto) to use one twelfth of Crown scale (kept between 0.1 and 1 m). It follows the crown size rather than the point density, so sparse scans get a fine grid too; a coarse grid merges neighboring trees.

    For TreeIso, adjust these if needed. The size-dependent settings (the internal decimation and the max-gap below) are seeded from the cloud's extent each time the panel opens — fine for a close-range scan, coarser for a field- or airborne-scale tile — so a large-area scan is handled as efficiently as a close-range one instead of stalling: - 3D reg. strength (λ₁) — regularization for the initial 3D segmentation. Default 1.0. - 2D reg. strength (λ₂) — regularization for the intermediate 2D grouping; the most influential knob. Default 15. - Max intra-tree gap (m) — the largest gap (from occlusion) still treated as belonging to one tree. Default 2.0 (seeded larger for very large tiles). Lower it when trees stand close together so neighbors aren't merged. - Separate trees beyond (m) — after trees are assembled, any part of one tree sitting further than this from the rest of it is treated as a different tree. Default 0.65. Lower it if a neighbor's branches are absorbed into the tree you want; raise it if one tree is broken into pieces. Note this is the opposite of the gap above: that one joins an occluded limb back to its tree, this one separates bodies too far apart to belong together — so it is normally the smaller of the two, and setting it above Max intra-tree gap means nothing will ever be separated (the panel warns when you do). Values below the cloud's own point spacing are raised automatically, since below that the test measures sampling rather than tree structure. - Split into one cloud per tree — when checked, also adds a separate cloud for each tree to the scan list. 5. Click Segment Trees. While it runs, the button shows a spinner and a Cancel button appears beside it — click Cancel to stop a long or stuck run immediately (the computation is killed and the cloud is left unchanged).

Results

The cloud is recolored by the tree_instance attribute: each tree gets a distinct color. Points TreeIso could not assign keep ID 0 ("Unassigned", shown gray). (No legend is shown for tree instances — with one entry per tree it would fill the viewport and the IDs are arbitrary anyway.) If you enabled Split, one new cloud per tree (… (tree N)) is added to the list, each carrying the same color that tree has in the recolored cloud — so the swatches in the scan list match what you see in the viewer. The recolored original is hidden automatically, so you see the per-tree clouds rather than the whole cloud drawn on top of them. Tick its eye icon in the scan list to bring it back.

The split runs after the recolored cloud appears, and each per-tree cloud gets its own display octree — on a large plot with many trees that takes a while. A Building n of N clouds… status pill at the top of the viewer tracks the progress; the per-tree clouds all appear in the scan list when it finishes. Canceling from the pill leaves the recolored parent cloud in place and adds no per-tree clouds.

Segment several clouds

The Clouds list at the top of the panel decides what is segmented. It starts with the clouds selected in the Scans pane checked — with nothing selected, nothing is checked and the panel asks you to check one. Once the panel is open, clicking in the Scans pane no longer changes the set; only the checkboxes do. Checking a hidden cloud shows it for as long as it stays checked.

With more than one checked, the button reads Segment N Clouds and the run works through them one after another:

  • Each cloud is segmented on its own. They are not merged: each gets its own Tree Instance column, numbered from 1, and its own per-tree clouds when Split is on. To segment several scans of the same trees as one, merge them into one cloud first.
  • One set of parameters runs on all of them, seeded from the widest checked cloud.
  • Trunk seeds, Auto-seed stems and Refine need exactly one cloud checked. They describe one cloud's trees. With several checked, seeds you have placed are kept but not used for the run.
  • The panel names the cloud it is on, and each one is unchecked as it finishes. Cancel stops the current cloud and skips the ones not started; the ones already finished keep their result.
  • A cloud that fails does not stop the others. The panel stays open with the failed clouds still checked and says what went wrong with each.
  • The large-run advisory is raised per cloud: the run pauses at the cloud that needs it, and Segment Anyway carries on from there.

Seeding trunks (optional)

For tricky scenes you can guide the result by marking trunks yourself (with one cloud checked):

  1. In the panel, turn on Seed trunks.
  2. Left-click each trunk in the viewer — a numbered marker drops at that spot. Right-click removes the last seed; Clear seeds removes all. (The camera is locked while seeding; turn the mode off to orbit.)
  3. Click Segment Trees. Each seed yields exactly one tree.

What a seed does depends on the method:

  • TreeIso — ambiguous segments are assigned to their nearest seed. A seed re-assigns whole segments, so it can join a tree that came out split, but it cannot separate trees TreeIso has already merged into one segment.
  • Canopy height — a seed replaces any automatic treetop within half the Crown scale of it, and every other tree is still found automatically. So you only seed the trees that came out wrong: put a seed on each of two merged trees to split them, or one seed on a crown that was split to join it. Seeded trees get IDs 1…n in the order you placed them.

Auto-seed stems

On a plot with many trees, let Phytograph find the trunks: click Auto-seed stems. It looks for trunks in the layer 1–2 m above the terrain, so run Generate DEM with Height above ground ticked first. It fills the seed list with one seed per trunk and turns Seed trunks on so you can review them: remove a wrong one with right-click (the last seed) or add one it missed by clicking. Then click Segment Trees. Trunks the scan could not see at breast height are missed, and a big dead branch or a post can be seeded. Treat the result as a first draft. How it decides is on Stem detection & tiling.

Panels block seeding

The floating panels (Tree Segmentation, the scan/mesh stack on the right, Display, and any toast) sit over the viewport, so they take the click before the seeding overlay can. While Seed trunks is on, moving onto one puts a ⊘ at the cursor — a seed can't land there. Only the panels themselves block; the empty space around them in the right-hand column is ordinary viewport. The panels stay usable while seeding; to reach a trunk behind one, turn seeding off, orbit or pan it into the open, and turn seeding back on.

Large plots: tiling

TreeIso only — Canopy height handles any plot size in one pass, so the tiling settings are hidden for it.

A plot too big to segment at once is segmented in square tiles, each with a buffer of its neighbors' points. Every tree is then kept from the one tile its stem stands in, so trees crossing tile lines stay whole.

Setting Default Meaning
Tiling Auto Auto tiles only when the plot is too big to segment at once; On always tiles; Off never does.
Tile buffer 10 m How far past its tile each tile sees. It must be wider than any crown reaches from its stem.

If trees may have been cut off at a buffer, a warning says how many: widen the buffer beyond the widest crown and run again. Seeds (manual or automatic) work with tiling, and each tree keeps its seed's number. The method is on Stem detection & tiling.

Refining the result

Once a cloud is segmented (flat clouds), a Refine section appears:

  • Merge — combine two tree IDs into one (e.g. when one tree was split in two): enter the two IDs and click Merge.
  • Split — separate a tree that actually contains two by spatial gaps: enter the tree ID and click Split; parts further apart than Separate trees beyond become new trees.

Tips

  • Results are best on ground-removed, reasonably dense clouds.
  • Trees are automatically separated where one instance's own points are split by a wide 3D gap, so a neighboring tree's branches are not absorbed into the tree you are measuring. This matters most when you have cropped the cloud around a single tree: the surrounding trees then appear as crown fragments with no trunk, which is exactly the shape the segmentation is otherwise inclined to attach to the nearest complete tree.
  • If neighboring trees still merge into one, lower Separate trees beyond first — that is the knob for this — then Max intra-tree gap. If whole crowns are merged (not just a neighbor's branches), try Canopy height.
  • If several trees come back as one instance each — for example an orchard returning one instance per row — re-run the tool. This is a known defect in the underlying graph-cut solver, which occasionally fails to divide the cloud at all; the tool detects the common case and retries automatically, but the result can still come back fused. It depends on the exact number of points, so simply running it again on a slightly cropped or downsampled cloud usually clears it. Changing 1D/2D reg. strength does not help here — those knobs have no effect when this happens. The warning names this cause only when it actually happened.
  • Phytograph warns you when an instance contains more than one trunk, which is the signature of several trees having been merged. Trust that warning over the tree count: a fused result looks perfectly plausible otherwise, and every per-tree measurement taken from it will be wrong. The tree count it gives is a minimum — trunks the scan barely sampled are not counted, so on an airborne scan the true number can be several times higher.
  • If the warning appears on an airborne scan, or on crowns that touch, switch Method to Canopy height. Lowering 2D reg. strength also splits merged TreeIso instances, but on such scans it tends to break single trees into pieces before it separates all the merged ones.
  • If one tree is split into several, raise 2D reg. strength or Merge the pieces afterward.
  • Segmentation runs in the background, so the rest of the app stays responsive while it works. Use the panel's Cancel button to stop a run — closing the panel does not cancel it.
  • Large clouds are fine. TreeIso works on a voxel-decimated copy, so a multi-million-point plot is normally reduced to well under a million voxels before the heavy work starts — Phytograph sizes those voxels from the cloud's own point spacing.
  • If a run would be unusually expensive, the panel shows an amber warning with the estimated workload and the button changes to Segment Anyway. This is only a heads-up, never a block: click again to run it, and use Cancel if it takes longer than you want. To make it faster instead, crop to a smaller area or downsample first.

See also