satpy.composites.spectral module
Composite classes for spectral adjustments.
- class satpy.composites.spectral.GreenCorrector(*args, fractions=(0.85, 0.15), **kwargs)[source]
Bases:
SpectralBlender
Previous class used to blend channels for green band corrections.
This method has been refactored to make it more generic. The replacement class is ‘SpectralBlender’ which computes a weighted average based on N number of channels and N number of corresponding weights/fractions. A new class called ‘HybridGreen’ has been created, which performs a correction of green bands centered at 0.51 microns following Miller et al. (2016, DOI:10.1175/BAMS-D-15-00154.2) in order to improve true color imagery.
Set default keyword argument values.
- class satpy.composites.spectral.HybridGreen(*args, fraction=0.15, **kwargs)[source]
Bases:
SpectralBlender
Corrector of the FCI or AHI green band.
The green band in FCI and AHI (and other bands centered at 0.51 microns) deliberately misses the chlorophyll spectral reflectance local maximum at 0.55 microns in order to focus on aerosol and ash rather than on vegetation. This affects true colour RGBs, because vegetation looks brown rather than green and barren surface types typically gets a reddish hue.
To correct for this the hybrid green approach proposed by Miller et al. (2016, DOI:10.1175/BAMS-D-15-00154.2) is used. The basic idea is to include some contribution also from the 0.86 micron channel, which is known for its sensitivity to vegetation. The formula used for this is:
hybrid_green = (1 - F) * R(0.51) + F * R(0.86)
where F is a constant value, that is set to 0.15 by default in Satpy.
For example, the HybridGreen compositor can be used as follows to construct a hybrid green channel for AHI, with 15% contibution from the near-infrared 0.85 µm band (B04) and the remaining 85% from the native green 0.51 µm band (B02):
hybrid_green: compositor: !!python/name:satpy.composites.spectral.HybridGreen fraction: 0.15 prerequisites: - name: B02 modifiers: [sunz_corrected, rayleigh_corrected] - name: B04 modifiers: [sunz_corrected, rayleigh_corrected] standard_name: toa_bidirectional_reflectance
Other examples can be found in the
ahi.yaml
andami.yaml
composite files in the satpy distribution.Set default keyword argument values.
- class satpy.composites.spectral.NDVIHybridGreen(*args, ndvi_min=0.0, ndvi_max=1.0, limits=(0.15, 0.05), strength=1.0, **kwargs)[source]
Bases:
SpectralBlender
Construct a NDVI-weighted hybrid green channel.
This green band correction follows the same approach as the HybridGreen compositor, but with a dynamic blend factor f that depends on the pixel-level Normalized Differece Vegetation Index (NDVI). The higher the NDVI, the smaller the contribution from the nir channel will be, following a liner (default) or non-linear relationship between the two ranges [ndvi_min, ndvi_max] and limits.
As an example, a new green channel using e.g. FCI data and the NDVIHybridGreen compositor can be defined like:
ndvi_hybrid_green: compositor: !!python/name:satpy.composites.spectral.NDVIHybridGreen ndvi_min: 0.0 ndvi_max: 1.0 limits: [0.15, 0.05] strength: 1.0 prerequisites: - name: vis_05 modifiers: [sunz_corrected, rayleigh_corrected] - name: vis_06 modifiers: [sunz_corrected, rayleigh_corrected] - name: vis_08 modifiers: [sunz_corrected ] standard_name: toa_bidirectional_reflectance
In this example, pixels with NDVI=0.0 will be a weighted average with 15% contribution from the near-infrared vis_08 channel and the remaining 85% from the native green vis_05 channel, whereas pixels with NDVI=1.0 will be a weighted average with 5% contribution from the near-infrared vis_08 channel and the remaining 95% from the native green vis_05 channel. For other values of NDVI a linear interpolation between these values will be performed.
A strength larger or smaller than 1.0 will introduce a non-linear relationship between the two ranges [ndvi_min, ndvi_max] and limits. Hence, a higher strength (> 1.0) will result in a slower transition to higher/lower fractions at the NDVI extremes. Similarly, a lower strength (< 1.0) will result in a faster transition to higher/lower fractions at the NDVI extremes.
Initialize class and set the NDVI limits, blending fraction limits and strength.
- _apply_strength(ndvi)[source]
Introduce non-linearity by applying strength factor.
The method introduces non-linearity to the ndvi for a non-linear scaling from ndvi to blend fraction in _compute_blend_fraction. This can be used for a slower or faster transision to higher/lower fractions at the ndvi extremes. If strength equals 1.0, this operation has no effect on the ndvi.
- _compute_blend_fraction(ndvi)[source]
Compute pixel-level fraction of NIR signal to blend with native green signal.
This method linearly scales the input ndvi values to pixel-level blend fractions within the range [limits[0], limits[1]] following this implementation <https://stats.stackexchange.com/a/281164>.
- class satpy.composites.spectral.SpectralBlender(*args, fractions=(), **kwargs)[source]
Bases:
GenericCompositor
Construct new channel by blending contributions from a set of channels.
This class can be used to compute weighted average of different channels. Primarily it’s used to correct the green band of AHI and FCI in order to allow for proper true color imagery.
Below is an example used to generate a corrected green channel for AHI using a weighted average from three channels, with 63% contribution from the native green channel (B02), 29% from the red channel (B03) and 8% from the near-infrared channel (B04):
corrected_green: compositor: !!python/name:satpy.composites.spectral.SpectralBlender fractions: [0.63, 0.29, 0.08] prerequisites: - name: B02 modifiers: [sunz_corrected, rayleigh_corrected] - name: B03 modifiers: [sunz_corrected, rayleigh_corrected] - name: B04 modifiers: [sunz_corrected, rayleigh_corrected] standard_name: toa_bidirectional_reflectance
Other examples can be found in the``ahi.yaml`` composite file in the satpy distribution.
Set default keyword argument values.