Enregistrer des images

L'algorithme d'enregistrement d'images Earth Engine est conçu pour être une étape finale, post-ortho, précise pour aligner les images. On suppose que les images à enregistrer ont déjà passé par des étapes d'alignement initial. Elles sont donc déjà à quelques degrés de rotation les unes des autres et ne diffèrent que par de petites translations. L'enregistrement utilise une technique de "feuille de caoutchouc", qui permet de déformer localement l'image pour corriger les erreurs d'orthorectification et d'autres artefacts issus d'un traitement précédent. La technique d'alignement sous-jacente est la corrélation d'images. Par conséquent, les bandes des images d'entrée et de référence doivent être visuellement similaires pour que l'algorithme puisse calculer un alignement précis.

Déplacement d'image

L'enregistrement d'une image se fait en deux étapes: déterminer l'image de déplacement à l'aide de displacement(), puis l'appliquer avec displace(). Les entrées requises sont la paire d'images à enregistrer et un paramètre de déplacement maximal (maxOffset).

L'algorithme displacement() prend une image de référence, un paramètre de déplacement maximal (maxOffset) et deux paramètres facultatifs qui modifient le comportement de l'algorithme. La sortie est une image de déplacement avec les bandes dx et dy qui donnent les composantes X et Y (en mètres) du vecteur de déplacement à chaque pixel.

Toutes les bandes des images d'appel et de référence sont utilisées pour la mise en correspondance lors de l'enregistrement. Le nombre de bandes doit donc être exactement égal. Les bandes d'entrée doivent être visuellement similaires pour que l'enregistrement aboutisse. Si ce n'est pas le cas, il est possible de les prétraiter (par exemple, lissage, détection des bords) pour les rendre plus similaires. Les calculs d'enregistrement sont effectués à l'aide d'un processus multiéchelle, de l'aperçu à l'aperçu détaillé, avec des projections de travail (multiéchelles) qui dépendent de trois des projections fournies à l'algorithme:

  1. la projection par défaut de l'image appelante (Pc) ;
  2. la projection par défaut de l'image de référence (Pr)
  3. la projection de sortie (Po) ;

La projection de travail de la plus haute résolution (Pw) sera dans le système de coordonnées de Pr, à une échelle déterminée par la résolution la plus grossière de ces trois projections, afin de minimiser le calcul. Les résultats de Pr sont ensuite échantillonnés pour être dans la projection spécifiée par le paramètre d'entrée "projection".

La sortie est une image de déplacement avec les bandes suivantes:

dx
Pour un emplacement de pixel d'image de référence donné, cette bande contient la distance dans la direction X à parcourir pour atteindre l'emplacement correspondant dans l'image appelante. Les unités sont exprimées en mètres géodésiques.
dy
Pour un emplacement de pixel d'image de référence donné, cette bande contient la distance dans la direction Y à parcourir pour atteindre l'emplacement correspondant dans l'image appelante. Les unités sont exprimées en mètres géodésiques.
confidence
Il s'agit d'une estimation par pixel du niveau de confiance du déplacement (où 0 correspond à un faible niveau de confiance et 1 à un niveau de confiance élevé) en fonction des scores de corrélation dans les régions où des correspondances valides ont été trouvées. Dans les régions où aucune correspondance n'a été trouvée, la confiance est estimée à partir des corrélations à proximité à l'aide d'un noyau gaussien pour donner plus de poids aux corrélations à proximité.

L'exemple suivant calcule l'ampleur et l'angle de déplacement entre deux images Terra Bella haute résolution:

Éditeur de code (JavaScript)

// Load the two images to be registered.
var image1 = ee.Image('SKYSAT/GEN-A/PUBLIC/ORTHO/MULTISPECTRAL/s01_20150502T082736Z');
var image2 = ee.Image('SKYSAT/GEN-A/PUBLIC/ORTHO/MULTISPECTRAL/s01_20150305T081019Z');

// Use bicubic resampling during registration.
var image1Orig = image1.resample('bicubic');
var image2Orig = image2.resample('bicubic');

// Choose to register using only the 'R' band.
var image1RedBand = image1Orig.select('R');
var image2RedBand = image2Orig.select('R');

// Determine the displacement by matching only the 'R' bands.
var displacement = image2RedBand.displacement({
  referenceImage: image1RedBand,
  maxOffset: 50.0,
  patchWidth: 100.0
});

// Compute image offset and direction.
var offset = displacement.select('dx').hypot(displacement.select('dy'));
var angle = displacement.select('dx').atan2(displacement.select('dy'));

// Display offset distance and angle.
Map.addLayer(offset, {min:0, max: 20}, 'offset');
Map.addLayer(angle, {min: -Math.PI, max: Math.PI}, 'angle');
Map.setCenter(37.44,0.58, 15);

Déformer une image

Vous pouvez déformer une image pour qu'elle corresponde à une autre de deux manières: displace() ou register(). L'algorithme displace() prend une image de déplacement avec les bandes dx et dy comme deux premières bandes, puis déforme l'image en conséquence. L'image de sortie résulte de la déformation des bandes de l'image d'entrée par les décalages présents dans l'image de déplacement. En utilisant les déplacements calculés dans l'exemple précédent:

Éditeur de code (JavaScript)

// Use the computed displacement to register all original bands.
var registered = image2Orig.displace(displacement);

// Show the results of co-registering the images.
var visParams = {bands: ['R', 'G', 'B'], max: 4000};
Map.addLayer(image1Orig, visParams, 'Reference');
Map.addLayer(image2Orig, visParams, 'Before Registration');
Map.addLayer(registered, visParams, 'After Registration');

Si vous n'avez pas besoin des bandes de déplacement, Earth Engine fournit la méthode register(), qui est un raccourci pour appeler displacement() suivi de displace(). Exemple :

Éditeur de code (JavaScript)

var alsoRegistered = image2Orig.register({
  referenceImage: image1Orig,
  maxOffset: 50.0,
  patchWidth: 100.0
});
Map.addLayer(alsoRegistered, visParams, 'Also Registered');

Dans cet exemple, les résultats de register() diffèrent de ceux de displace(). En effet, un ensemble de bandes différent a été utilisé dans les deux approches: register() utilise toujours toutes les bandes des images d'entrée, tandis que l'exemple displacement() n'utilise que la bande rouge avant de transmettre le résultat à displace(). Notez que lorsque plusieurs bandes sont utilisées, si les variances des bandes sont très différentes, cela peut donner trop de poids aux bandes à variance élevée, car les bandes sont normalisées conjointement lorsque leurs scores de corrélation spatiale sont combinés. Cela illustre l'importance de sélectionner la ou les bandes les plus visuellement similaires lors de l'enregistrement. Comme dans l'exemple précédent, utilisez displacement() et displace() pour contrôler les bandes utilisées pour calculer le déplacement.