Composition, masquage et mosaïque

Une fois la collection de réflectance TOA Landsat 8 chargée dans une variable appelée l8, vous avez vu que le code suivant génère une image composite de valeurs récentes :

Éditeur de code (JavaScript)

var l8 = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA');
var landsat2016 = l8.filterDate('2016-01-01', '2016-12-31');
Map.addLayer(landsat2016, visParams, 'l8 collection');

L'un des problèmes de cette image composite est qu'elle est pleine de nuages. Au lieu de simplement prendre le dernier pixel de la collection (lorsque vous ajoutez une collection à la carte, Earth Engine appelle implicitement mosaic() dessus), vous pouvez réduire l'ImageCollection (en savoir plus sur la réduction des collections d'images).

Composition avec des réducteurs

Vous avez d'abord découvert les réducteurs pour obtenir des statistiques dans une région d'image. Il s'agissait d'une réduction spatiale. La réduction d'une collection d'images à une image est une réduction temporelle lorsque la collection représente des images au fil du temps. Le type de Reducer que vous utilisez définit la manière dont Earth Engine gère les pixels qui se chevauchent. Landsat 8 visite le même point de la Terre tous les 16 jours. Cela signifie que sur une période de six mois, il y aura environ 12 images (et plus lorsque les scènes se chevauchent). Chaque pixel de la carte est dérivé d'une pile de pixels, un pour chaque image de la collection affichée.

Le simple fait d'ajouter la collection à la carte entraîne la sélection du pixel le plus récent, celui de la dernière image de la pile. Ce comportement peut être modifié à l'aide des réducteurs Earth Engine. Par exemple, au lieu de prendre le pixel le plus récent de la pile, Earth Engine peut être configuré pour choisir la valeur médiane de la pile. Cela présente l'avantage de supprimer les nuages (qui ont une valeur élevée) et les ombres (qui ont une valeur faible). Lorsqu'une collection d'images est réduite à l'aide du réducteur de médiane, la valeur composite est la médiane de chaque bande au fil du temps. Par exemple, en utilisant des scènes Landsat en 2016 :

Éditeur de code (JavaScript)

// Get the median over time, in each band, in each pixel.
var median = l8.filterDate('2016-01-01', '2016-12-31').median();

// Make a handy variable of visualization parameters.
var visParams = {bands: ['B4', 'B3', 'B2'], max: 0.3};

// Display the median composite.
Map.addLayer(median, visParams, 'median');

La nouveauté de ce code est la méthode median() appliquée à une collection d'images. Comme les méthodes de filtrage, il s'agit d'un raccourci pour la méthode reduce() plus générale sur les collections d'images, qui utilise un ee.Reducer() comme argument. Consultez le package ee.Reducer dans l'onglet Docs de l'éditeur de code pour afficher la liste de tous les réducteurs Earth Engine. Lorsque vous envisagez d'utiliser un réducteur pour une collection d'images, notez que la sortie est une image. Par conséquent, les réducteurs avec des sorties non numériques, par exemple les réducteurs histogram ou toList, ne fonctionneront pas avec une collection d'images.

Tutorial_api_06_median_composite
Figure 6. Composite médian Landsat 8.

Lorsque vous effectuez un zoom arrière sur la composition médiane, vous devriez voir quelque chose comme la figure 6. Le résultat devrait être bien meilleur que celui de la composition de valeurs récentes que vous avez créée précédemment. À ce stade, il est utile de prendre du recul et d'examiner ce qui a été fait pour créer cette image composite médiane. Earth Engine a chargé l'intégralité de la collection Landsat 8 sur la partie continentale des États-Unis et a calculé la médiane de chaque pixel. Cela représente beaucoup de données. Bien sûr, vous pouvez calculer les médianes annuelles en filtrant d'abord la collection, comme vous l'avez fait précédemment. Le fait est que si vous deviez télécharger toutes ces images et créer cette composition, ce serait un projet de grande envergure. Avec Earth Engine, vous obtenez un résultat en quelques secondes.

Pour en savoir plus sur la composition et la mosaïque, cliquez ici.

Masquage

Bien que la composition médiane soit une amélioration par rapport à la composition de valeur récente, vous pouvez masquer certaines parties de l'image. Le masquage des pixels d'une image rend ces pixels transparents et les exclut de l'analyse. Chaque pixel de chaque bande d'une image possède un masque. Ceux dont la valeur de masque est inférieure ou égale à 0 seront transparents. Ceux dont la valeur de masque est supérieure à 0 seront affichés. Le masque d'une image est défini à l'aide d'un appel tel que image1.mask(image2). Cet appel prend les valeurs de image2 et les utilise comme masque de image1. Tous les pixels de image2 ayant la valeur 0 seront rendus transparents dans image1.

Par exemple, supposons que vous souhaitiez masquer tous les pixels d'eau dans la composition médiane. Un masque d'eau peut être créé à l'aide de l'ensemble de données décrit par Hansen et al. (2013), qui se trouve dans le Data Catalog Earth Engine. (Pour en savoir plus sur l'ensemble de données Hansen et al., consultez ce tutoriel.) Dans cet ensemble de données, l'eau a une valeur de 2, la terre a une valeur de 1 et "aucune donnée" a une valeur de 0. Utilisez un peu de logique pour créer une image de masque qui comporte des zéros là où il n'y a pas de terre :

Éditeur de code (JavaScript)

// Load or import the Hansen et al. forest change dataset.
var hansenImage = ee.Image('UMD/hansen/global_forest_change_2025_v1_13');

// Select the land/water mask.
var datamask = hansenImage.select('datamask');

// Create a binary mask.
var mask = datamask.eq(1);

// Update the composite mask with the water mask.
var maskedComposite = median.updateMask(mask);
Map.addLayer(maskedComposite, visParams, 'masked');

Ce code comporte quelques nouveautés qui méritent d'être mentionnées en détail. Tout d'abord, la fonction select() est utile pour extraire les bandes d'intérêt d'une image. Ici, nous ne sélectionnons que la bande qui nous intéresse : datamask. La nouveauté suivante est l'opérateur logique eq(), qui signifie "égal à". Nous utilisons eq(1) pour créer une image binaire dans laquelle tous les pixels qui n'ont pas la valeur 1 dans la bande datamask (ceux qui sont de l'eau ou qui ne contiennent pas de données) obtiennent la valeur 0 dans l'image obtenue.

Grâce à ce masquage, tous les pixels de la composition médiane qui se trouvent sur la terre (selon l'ensemble de données Hansen et al.) sont visibles, mais ceux qui se trouvent sur l'eau (ou nodata) sont transparents et seront exclus de toute analyse que vous effectuerez sur l'image maskedComposite.

Mosaïquage

En combinant les concepts de collections d'images, d'opérateurs logiques, de masquage et de composition, vous pouvez obtenir des résultats cartographiques intéressants. Par exemple, supposons que vous souhaitiez obtenir une image dans laquelle les pixels de terre sont affichés en couleurs réelles et tous les autres pixels sont affichés en bleu. Vous pouvez procéder comme suit :

Éditeur de code (JavaScript)

// Make a water image out of the mask.
var water = mask.not();

// Mask water with itself to mask all the zeros (non-water).
water = water.mask(water);

// Make an image collection of visualization images.
var mosaic = ee.ImageCollection([
  median.visualize(visParams),
  water.visualize({palette: '000044'}),
]).mosaic();

// Display the mosaic.
Map.addLayer(mosaic, {}, 'custom mosaic');

Il se passe beaucoup de choses dans ce code. Analysons-le. Tout d'abord, nous utilisons l'opérateur logique not() pour inverser le masque que nous avons créé précédemment. Plus précisément, not() transforme tous les zéros en uns et tous les non-zéros en zéros. Il n'est pas tout à fait correct d'appeler cette variable water, car elle inclut également des pixels sans données, mais cela convient dans le contexte cartographique actuel. L'étape suivante consiste à masquer l'eau avec elle-même. On obtient ainsi une image dans laquelle tous les pixels d'eau sont des 1 et tout le reste est masqué. La dernière étape consiste à combiner les images avec mosaic(). Étant donné que mosaic() fonctionne sur une collection d'images, nous transmettons une liste d'images que nous voulons combiner dans le constructeur de la collection d'images, puis nous appelons mosaic() comme dernière étape. L'ordre des images dans cette liste est important. Plus précisément, l'image de sortie contiendra le dernier pixel non masqué de la pile d'images de la collection d'entrée. Dans ce cas, cela fonctionne, car la couche d'eau est la dernière image (supérieure) de la collection et ne contient que des pixels non masqués là où l'eau est présente.

Notez que les images de la collection sont des images de visualisation. Lorsque vous appelez visualize() sur une image, elle est convertie en image 8 bits à trois bandes en fonction des paramètres de visualisation que vous transmettez. Les paramètres de visualisation par défaut fonctionnent bien pour les images 8 bits à trois bandes. Vous n'avez donc pas besoin de paramètres de visualisation lorsque vous ajoutez l'image à la carte. Le résultat doit ressembler à la figure 7.

Tutorial_api_07_mosaic.png
Figure 7. Mosaïque personnalisée qui donne une couleur uniforme aux zones d'eau.

À ce stade, vous avez vu comment visualiser des collections d'images sous forme de composites de valeurs récentes, des méthodes pour composer des collections d'images à l'aide de réducteurs et des méthodes pour créer des composites personnalisés en masquant et en mosaïquant une collection d'images. Sur la page suivante, découvrez comment ajouter un indice de végétation à chaque image d'une collection et l'utiliser pour créer une image composite du "pixel le plus vert".