Source code for satsense.features.ndxi

"""Implementation of the NDXI family of features."""
from functools import partial

import numpy as np

from ..image import Image
from .feature import Feature

NDXI_TYPES = {
    'nir_ndvi': ('nir-1', 'red'),
    'rg_ndvi': ('red', 'green'),
    'rb_ndvi': ('red', 'blue'),
    'ndsi': ('nir-1', 'green'),
    'ndwi': ('coastal', 'nir-2'),
    'wvsi': ('green', 'yellow'),
}


def ndxi_image(image: Image, ndxi_type):
    """Calculates the feature according to the ndxi option provided."""
    band_0_name, band_1_name = NDXI_TYPES[ndxi_type]
    band_0 = image[band_0_name]
    band_1 = image[band_1_name]

    band_mix = band_0 + band_1
    # Ignore divide, this division may complain about division by 0
    # This usually happens in the edge, which is alright by us.
    old_settings = np.seterr(divide='ignore', invalid='ignore')
    ndxi = np.divide(band_0 - band_1, band_mix)
    ndxi[band_mix == 0] = 0
    np.seterr(**old_settings)

    return ndxi


for itype in NDXI_TYPES:
    Image.register(itype, partial(ndxi_image, ndxi_type=itype))


def print_ndxi_statistics(ndxi, option):
    """Prints the ndvi matrix and the, min, max, mean and median."""
    print('{o} matrix: '.format(o=option))
    print(ndxi)

    print('\nMax {o}: {m}'.format(o=option, m=np.nanmax(ndxi)))
    print('Mean {o}: {m}'.format(o=option, m=np.nanmean(ndxi)))
    print('Median {o}: {m}'.format(o=option, m=np.nanmedian(ndxi)))
    print('Min {o}: {m}'.format(o=option, m=np.nanmin(ndxi)))


class NDXI(Feature):
    """
    The parent class of the family of NDXI features.

    Parameters
    ----------
    window_shapes: list
        The window shapes to calculate the feature on.

    """
    size = 1
    compute = staticmethod(np.mean)


[docs]class NirNDVI(NDXI): """ The infrared-green normalized difference vegetation index. For more information see [2]_. Parameters ---------- window_shapes: list The window shapes to calculate the feature on. Notes ----- .. [2] https://en.wikipedia.org/wiki/Normalized_difference_vegetation_index """ base_image = 'nir_ndvi'
[docs]class RgNDVI(NDXI): """ The red-green normalized difference vegetation index. For more information see [3]_. Parameters ---------- window_shapes: list The window shapes to calculate the feature on. Notes ----- .. [3] Motohka, T., Nasahara, K.N., Oguma, H. and Tsuchida, S., 2010. "Applicability of green-red vegetation index for remote sensing of vegetation phenology". Remote Sensing, 2(10), pp. 2369-2387. """ base_image = 'rg_ndvi'
[docs]class RbNDVI(NDXI): """ The red-blue normalized difference vegetation index. For more information see [4]_. Parameters ---------- window_shapes: list The window shapes to calculate the feature on. Notes ----- .. [4] Tanaka, S., Goto, S., Maki, M., Akiyama, T., Muramoto, Y. and Yoshida, K., 2007. "Estimation of leaf chlorophyll concentration in winter wheat [Triticum aestivum] before maturing stage by a newly developed vegetation index-RBNDVI". Journal of the Japanese Agricultural Systems Society (Japan). """ base_image = 'rb_ndvi'
[docs]class NDSI(NDXI): """ The snow cover index. Parameters ---------- window_shapes: list The window shapes to calculate the feature on. """ base_image = 'ndsi'
[docs]class NDWI(NDXI): """ The water cover index. Parameters ---------- window_shapes: list The window shapes to calculate the feature on. """ base_image = 'ndwi'
[docs]class WVSI(NDXI): """ The soil cover index. Parameters ---------- window_shapes: list The window shapes to calculate the feature on. """ base_image = 'wvsi'