142 lines
3.3 KiB
ReStructuredText
142 lines
3.3 KiB
ReStructuredText
.. _basics:
|
|
|
|
===========
|
|
Basic use
|
|
===========
|
|
|
|
|
|
Loading images
|
|
==============
|
|
|
|
HyTools includes options for loading both ENVI formatted binary files, NASA NetCDF files,
|
|
and NEON AOP HDF files.
|
|
|
|
.. code-block:: python
|
|
|
|
import hytools as ht
|
|
|
|
#Create a HyTools container object
|
|
envi = ht.HyTools()
|
|
|
|
#Read and load file metadata
|
|
envi.read_data('./envi_file.bin',file_type= 'envi')
|
|
|
|
For reading NEON data the process is the same:
|
|
|
|
.. code-block:: python
|
|
|
|
#Load an NEON HDF image
|
|
neon = ht.HyTools()
|
|
neon.read_data("./neon_file.h5",'neon')
|
|
|
|
|
|
Reading data
|
|
============
|
|
|
|
There are several ways to read data using a :class:`~hytools.base.HyTools` object. One option
|
|
is to use one of the 'get' methods:
|
|
|
|
.. code-block:: python
|
|
|
|
wave = neon.get_wave(900)
|
|
band = neon.get_band(10)
|
|
column = neon.get_column(1)
|
|
line = neon.get_line(234)
|
|
chunk = neon.get_chunk(x1,x2,y1,y2)
|
|
pixels = neon.get_pixels([0,1,2],[3,4,5])
|
|
|
|
We can also retrieve masked data, where a binary mask is used to
|
|
return a subset of the data. Currently masking only works using the
|
|
:meth:`~hytools.base.HyTools.get_band` or
|
|
:meth:`~hytools.base.HyTools.get_wave` methods. First we need to
|
|
generate a mask, which can be done using the
|
|
:meth:`~hytools.base.HyTools.gen_mask` method.
|
|
|
|
.. code-block:: python
|
|
|
|
# NDVI masking function
|
|
def masker(hy_obj):
|
|
ir = hy_obj.get_wave(900)
|
|
red = hy_obj.get_wave(660)
|
|
ndvi = (ir-red)/(ir+red)
|
|
return ndvi > .5
|
|
|
|
# Generate mask
|
|
neon.gen_mask(masker)
|
|
|
|
# Retrieve pixels where mask is True
|
|
pixels = neon.get_band(100, mask_values = True)
|
|
|
|
|
|
Alternatively an :class:`~hytools.base.Iterator` can be used to cycle along a
|
|
specified axis of the dataset either by line, column, band or
|
|
chunk. This is useful for cycling through and image, applying
|
|
a function/algorithm and then writing to a file.
|
|
|
|
.. code-block:: python
|
|
|
|
iterator = hy_obj.iterate(by = 'line')
|
|
|
|
Next cycle through the image line by line until complete:
|
|
|
|
.. code-block:: python
|
|
|
|
while not iterator.complete:
|
|
line = iterator.read_next()
|
|
|
|
|
|
Writing data
|
|
============
|
|
|
|
Currently writing is only supported for ENVI files and NetCDF files, however data from
|
|
NEON hdf files can be easy written to ENVI format using builtin
|
|
functions.
|
|
|
|
First an ENVI header dictionary needs to be generated to specify the
|
|
file size, datatype, interleave and other relevant metadata. This is
|
|
done using the :func:`~hytools.io.envi.envi_header_from_hdf` function.
|
|
|
|
.. code-block:: python
|
|
|
|
header_dict = envi_header_from_hdf(neon)
|
|
|
|
In this case we are going to export an RGBI image so we need to update
|
|
the number of bands:
|
|
|
|
.. code-block:: python
|
|
|
|
head_dict['bands'] = 4
|
|
|
|
Next we create an :class:`~hytools.io.envi.WriteENVI` object which
|
|
generates the header and image file using the specifications in the
|
|
header dictionary:
|
|
|
|
.. code-block:: python
|
|
|
|
output_name = './neon.bin'
|
|
writer = WriteENVI(output_name,header_dict)
|
|
|
|
Finally we can write the bands to file. First we retrieve the closest
|
|
wavelength to each input wavelength using the
|
|
:meth:`~hytools.base.HyTools.get_wave` method, next we write the band
|
|
to the new file with the :meth:`~hytools.io.envi.WriteENVI.write_band`
|
|
method.
|
|
|
|
.. code-block:: python
|
|
|
|
for band_num,wavelength enumerate([660,550,440,880]):
|
|
wave = neon.get_wave(wavelength)
|
|
writer.write_band(wave,band_num)
|
|
writer.close()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|