Cloud To Frame Conversion

Motivation

We would like to have a “Height channel” in our Frame2D. This can likely improve our meaningless segmentation/supervised learning. This gives a robust Canopy Height Estimation on the 2D plane.

Note that this is still an estimation as we have to interpolate points.

Matching Dimensions

For our 3D data, we use .las, 2D using a geo-referenced .tiff.

These 2 formats contains enough information for us to detect the correct latitude longitude position on earth.

Using osgeo to decode .tiff, we can get the lat-long ranges, this gives us a rectangular bound in which we would want the height data. The area mapped for 2D and 3D are different. Hence it’s important to make this distinction.

Using laspy to decode .las, we can get the UTM data, I’ll refrain from describing it here since I’m not well versed in geo-referencing, it’s a miracle I made it work anyways.

By converting UTM to lat-long using the package utm, I can thus fit it onto the 2D data.

Interpolation

Note that since Cloud3D X and Y doesn’t always fall on integer X, Y values, it’s not possible to directly map Cloud3D onto Frame2D, thus we estimate the values at every integer through interpolation.

In this project, we do receive the spectral bands from a 2D image, hence there is no need for interpolation of the RGB bands in the .las.

The interpolation used is the scipy.interpolate.CloughTocher2DInterpolator.

Usually the cloud points is in the millions, and interpolation may be slow with large amount of samples; it may be inaccurate with low amount of it. A balance must be struck to find the appropriate value for interpolation.

Example

Here we demonstrate a simple Cloud to Frame conversion with the Cubic Interpolation.

c = Cloud3D.from_las("path/to/las.las")
f = c.to_frame(geotiff_path="path/to/geotiff.tif",
               shape=(a, b),
               samples=samples)

This grabs the .las and maps it to the .tif lat long provided.

The shape defines the resolution and the samples defines how many random points to take for interpolation.

Module Info

class frmodel.base.D3.cloud._cloud_frame._Cloud3DFrame

Bases: abc.ABC

to_frame(geotiff_path: str, shape: tuple, samples: int = 100000)

Converts this Cloud3D into a 2D Frame

This algorithm uses geotiff metadata to fit the Cloud data onto it.

Parameters
  • geotiff_path – A Geo-referencable geotiff path

  • shape – The expected shape, this is usually specified by the Frame2D.from_image_spec

  • samples – The number of cloud samples to randomly sample for interpolation.

Returns