Question

Extract Trees from DSM, DTM and Colour Infared Data

  • 18 November 2019
  • 4 replies
  • 25 views

Badge +9

Hi All

I Have the following datasets, DTM, DSM and Colour Infared, and am trying to extract trees over 3 metres in height from the data.

I know that i can subtract the DTM from the DSM to give me the height difference but can not see how to have only the raster cells over 3m, nor can i see how to extract the polygons from the imagery.

If anyone has any suggestions on how to do this then please comment.

 

 


4 replies

Userlevel 2
Badge +11

Hi @ingalla,

It looks like a good task for FME. I think you need to take the following steps.

1) For finding the difference between DTM and DSM, you can use either RasterExpressionEvaluator or its sibling RasterCellValueCalculator, which is easier to, but may require extra steps afterwards.

In RasterExpressioNEvaluator, send your DSM and DTM into A and B ports, and use the following expression:

if(A[0]-B[0]>=3,255,0)

this tells to set all pixels of the output rasters that are 3m or higher above the pixels in DTM to 255, and the rest of the pixels to 0.

2) Now you need to find where you have trees in the areas that are higher than 3 m (if the threes are the only objects you have, skip this step). For this, you can use your infrared image - find the value that clearly defines trees (for example, by building NDVI with NDVICalculator available through FME Hub - you will need Red and Infrared bands for that). Once you have your NDVI, take everything what is above, say, 0, or 0.2 (you have to inspect what is the lowest pixel value of tree areas on your image) and use RasterExpressionEvaluator again, something like this - send you single raster into port A and type this expression:

if(A[0]>=0.2,255,0)

This is how you get areas with trees (still as a raster)

 

3) now you can use RasterExpressionEvaluator again to find where the values above 3m and values where you have trees overlap. Send both rasters to A and B ports of the RasterExpressionEvaluator. The expression may look as follows:

if(A[0]==255&&B[0]==255,255,0).

 

This will output a raster that has pixel value of 255 wherever objects are 3m and higher AND they are vegetation, the rest will be 0.

4) The last step is to convert this raster to polygon. You can use RasterToPolygonCoercer and maybe a couple of Generalizers afterwards - one for simplifying the shape (getting rid of the pixelated look), and one for smoothing the output if necessary.

 

One important condition - all the images have to have the same extents and resolution. If it is not the case, you will need to resample them (RasterResample) and clip to the common extents.

 

 

If this looks like a lot, feel free to contact me directly at and I can help you more with the details.

Dmitri

Badge +12

Hi @ingalla !

 

I guess that you are aiming to only find the regions with trees >3m? Then the process suggested by @dmitribagh sounds good.

 

However, if your aim is to find the position for individual trees, it is an entirely different matter, and much more difficult.

 

I have, in fact, spent a lot of work with FME trying to extract positions, height and diameter of trees, using only LIDAR (pointcloud) data and building polygons as input - actually my LAS files did not even have a vegetation class, making it even more difficult.

 

 

My workspace is very complex and not in a state ready for presentation right now, but I'm thinking of sending it as a possible submission to the FME UC 2020, or at least at the next World Tour if it stops by Stockholm. Just letting you know that it can be done (if you have a dense LIDAR pointcloud), with a reasonably good result:

 

Badge +11

Hi @ingalla !

 

I guess that you are aiming to only find the regions with trees >3m? Then the process suggested by @dmitribagh sounds good.

 

However, if your aim is to find the position for individual trees, it is an entirely different matter, and much more difficult.

 

I have, in fact, spent a lot of work with FME trying to extract positions, height and diameter of trees, using only LIDAR (pointcloud) data and building polygons as input - actually my LAS files did not even have a vegetation class, making it even more difficult.

 

 

My workspace is very complex and not in a state ready for presentation right now, but I'm thinking of sending it as a possible submission to the FME UC 2020, or at least at the next World Tour if it stops by Stockholm. Just letting you know that it can be done (if you have a dense LIDAR pointcloud), with a reasonably good result:

 

Hi @ingalla​ 

I'm wondering if you have made any headway with an FME Presentation?

Hi @ingalla !

 

I guess that you are aiming to only find the regions with trees >3m? Then the process suggested by @dmitribagh sounds good.

 

However, if your aim is to find the position for individual trees, it is an entirely different matter, and much more difficult.

 

I have, in fact, spent a lot of work with FME trying to extract positions, height and diameter of trees, using only LIDAR (pointcloud) data and building polygons as input - actually my LAS files did not even have a vegetation class, making it even more difficult.

 

 

My workspace is very complex and not in a state ready for presentation right now, but I'm thinking of sending it as a possible submission to the FME UC 2020, or at least at the next World Tour if it stops by Stockholm. Just letting you know that it can be done (if you have a dense LIDAR pointcloud), with a reasonably good result:

 

Hi @jonas_nelson​ ,

I'm wondering if you could share your workspace with me, since I'm trying to solve a similar task?

Reply