Convolutions

Pour effectuer des convolutions linéaires sur des images, utilisez image.convolve(). Le seul argument à convoler est un ee.Kernel, qui est spécifié par une forme et les poids du noyau. Chaque pixel de l'image générée par convolve() est la combinaison linéaire des valeurs du noyau et des pixels de l'image d'entrée couverts par le noyau. Les noyaux sont appliqués individuellement à chaque bande. Par exemple, vous pouvez utiliser un noyau passe-bas (lissage) pour supprimer les informations à haute fréquence. L'image suivante illustre un noyau passe-bas 15x15 appliqué à une image Landsat 8:

Éditeur de code (JavaScript)

// Load and display an image.
var image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318');
Map.setCenter(-121.9785, 37.8694, 11);
Map.addLayer(image, {bands: ['B5', 'B4', 'B3'], max: 0.5}, 'input image');

// Define a boxcar or low-pass kernel.
var boxcar = ee.Kernel.square({
  radius: 7, units: 'pixels', normalize: true
});

// Smooth the image by convolving with the boxcar kernel.
var smooth = image.convolve(boxcar);
Map.addLayer(smooth, {bands: ['B5', 'B4', 'B3'], max: 0.5}, 'smoothed');

La sortie de la convolution avec le filtre passe-bas doit ressembler à la figure 1. Notez que les arguments du noyau déterminent sa taille et ses coefficients. Plus précisément, lorsque le paramètre units est défini sur "pixels", le paramètre radius spécifie le nombre de pixels à partir du centre que le noyau couvrira. Si normalize est défini sur "true", la somme des coefficients du noyau est égale à un. Si le paramètre magnitude est défini, les coefficients du noyau sont multipliés par l'amplitude (si normalize est également défini sur "true", la somme des coefficients est égale à magnitude). Si une valeur négative est définie pour l'un des coefficients du noyau, la somme des coefficients est égale à zéro.normalize

boxcar_sf
Figure 1. Image Landsat 8 convolved avec un noyau de lissage. Baie de San Francisco, Californie, États-Unis

Utilisez d'autres noyaux pour obtenir l'effet de traitement d'image souhaité. Cet exemple utilise un noyau laplacien pour la détection de bords isotropes:

Éditeur de code (JavaScript)

// Define a Laplacian, or edge-detection kernel.
var laplacian = ee.Kernel.laplacian8({ normalize: false });

// Apply the edge-detection kernel.
var edgy = image.convolve(laplacian);
Map.addLayer(edgy,
             {bands: ['B5', 'B4', 'B3'], max: 0.5, format: 'png'},
             'edges');

Notez le spécificateur de format dans les paramètres de visualisation. Earth Engine envoie des tuiles d'affichage à l'éditeur de code au format JPEG pour plus d'efficacité. Toutefois, les tuiles de bordure sont envoyées au format PNG pour gérer la transparence des pixels en dehors de la limite de l'image. En cas de discontinuité visuelle, définir le format sur PNG permet d'obtenir un affichage cohérent. Le résultat de la convolution avec le noyau de détection des bords laplacien doit ressembler à la figure 2.

laplacian_sf
Figure 2. Image Landsat 8 convolved avec un noyau de détection de bords laplacien. Baie de San Francisco, Californie, États-Unis

Il existe également des noyaux de détection des bords anisotropes (par exemple, Sobel, Prewitt, Roberts), dont la direction peut être modifiée avec kernel.rotate(). D'autres noyaux passe-bas incluent un noyau gaussien et des noyaux de différentes formes avec des poids uniformes. Pour créer des noyaux avec des poids et une forme définis de manière arbitraire, utilisez ee.Kernel.fixed(). Par exemple, ce code crée un noyau 9x9 de 1 avec un zéro au milieu:

Éditeur de code (JavaScript)

// Create a list of weights for a 9x9 kernel.
var row = [1, 1, 1, 1, 1, 1, 1, 1, 1];
// The center of the kernel is zero.
var centerRow = [1, 1, 1, 1, 0, 1, 1, 1, 1];
// Assemble a list of lists: the 9x9 kernel weights as a 2-D matrix.
var rows = [row, row, row, row, centerRow, row, row, row, row];
// Create the kernel from the weights.
var kernel = ee.Kernel.fixed(9, 9, rows, -4, -4, false);
print(kernel);