class_docstr: 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.
class_docstr_tok: ["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","."]
docstr: Construct the hybrid green channel weighted by NDVI.
docstr_tok: ["Construct","the","hybrid","green","channel","weighted","by","NDVI","."]
code: def __call__(self, projectables, optional_datasets=None, **attrs):
      """Construct the hybrid green channel weighted by NDVI."""
      LOG.info(
          f"Applying NDVI-weighted hybrid-green correction with limits [{self.limits[0]}, "
          f"{self.limits[1]}] and strength {self.strength}."
      )
  
      projectables = self.match_data_arrays(projectables)
  
      ndvi = (projectables[2] - projectables[1]) / (
          projectables[2] + projectables[1]
      )
  
      ndvi = ndvi.clip(self.ndvi_min, self.ndvi_max)
  
      # Introduce non-linearity to ndvi for non-linear scaling to NIR blend fraction
      if (
          self.strength != 1.0
      ):  # self._apply_strength() has no effect if strength = 1.0 -> no non-linear behaviour
          ndvi = self._apply_strength(ndvi)
  
      # Compute pixel-level NIR blend fractions from ndvi
      fraction = self._compute_blend_fraction(ndvi)
  
      # Prepare input as required by parent class (SpectralBlender)
      self.fractions = (1 - fraction, fraction)
  
      return super().__call__(
          [projectables[0], projectables[2]], **attrs
      )
  
file_path: satpy/satpy/composites/spectral.py
imports: import logging
  from satpy.composites import GenericCompositor
  from satpy.dataset import combine_metadata
label_desc: Use image node_id 2 for calling the NDVIHybridGreen obj's underlying member method code with example usage: obj.__call__(projectables, optional_datasets) and returns: super