I'm trying to delineate and count trees from a DSM/DTM generated from a UAV survey. It's from a citrus grove where trees are growing in different spacing. I have developed a workflow that works for most trees, but has some false positives. I'm stuck with reducing these false positives.
I'm using the concept of detecting local maxima and subsequently treat the trees as watersheds to delineate tree crowns. I'm using ArcGIS, for training purposes I'd like to only use this.
I'll provide my workflow below, additionally you can see some images with comments here: http://imgur.com/a/fLjia
- extract tree height by subtracting the DSM from the DTM
- clean up the resulting tree height raster with CON to remove negative values
- use low pass filter to smooth the raster a bit (FILTER)
- invert the raster. Trees are now holes. (RASTER CALCULATOR)
- FOCAL FLOW to detect local minima (Value = 255)
- Extract local minimas, use CON to replace 255 with the actual tree height from inverted tree height raster. I now have a raster which only has pixel values at the tree tops and NoData inbetween.
- Convert tree tops to point features (= Input for pour point in WATERSHED)
- Optional: Remove identified trees below a certain height (I used 1 m as cut-off)
- IsNull to generate a raster with 1 and 0, where tree tops are 0 and the space inbetween is 1.
- SetNull to use this 0-1 raster to replace the pixel-values of the tree tops in the tree height raster with NoData (this will be the pour point for WATERSHED)
- Use FILL to remove sinkholes
- FLOW DIRECTION to generate the flow direction
- WATERSHED to generate the water sheds (= the tree crowns)
- Invert the raster back to normal
- Remove areas around trees (grass, soil, etc) by removing all values below a certain height (I used 1 m again). This workflow works fine for most trees.
The problem: Have a look at the images and you'll notice that some detected local minimas (= tree tops) are too close together. There should be only one. This results in multiple watersheds beging generated and I get multiple tree crowns instead of only one.
I have no idea how to treat this. I can use NEAR on the extracted point features to detect those groups, but what next?
One idea would be to detect groups of near-points and only keep the highest (lowest) one and remove the others.
Or can I filter my initial data more aggressive?