Bilder registrieren

Der Earth Engine-Algorithmus zur Bildregistrierung ist als abschließender, feiner Schritt nach der Orthorektifizierung zur Ausrichtung von Bildern konzipiert. Es wird davon ausgegangen, dass die zu registrierenden Bilder bereits die anfänglichen Ausrichtungsphasen durchlaufen haben, sodass sie sich bereits um einige Grad drehen und sich nur durch kleine Verschiebungen unterscheiden. Bei der Registrierung wird ein Gummibandverfahren verwendet, das eine lokale Bildverformung ermöglicht, um Orthorektifizierungsfehler und andere Artefakte aus der vorherigen Verarbeitung zu korrigieren. Die zugrunde liegende Ausrichtungstechnik ist die Bildkorrelation. Die Bänder der Eingabe- und Referenzbilder müssen also visuell ähnlich sein, damit der Algorithmus eine genaue Ausrichtung berechnen kann.

Bildverschiebung

Es gibt zwei Schritte zum Registrieren eines Bilds: das Verschieben des Bilds mit displacement() und das Anwenden mit displace(). Die erforderlichen Eingaben sind das zu registrierende Bildpaar und ein Parameter für die maximale Verschiebung (maxOffset).

Der displacement()-Algorithmus benötigt ein Referenzbild, einen Parameter für die maximale Verschiebung (maxOffset) und zwei optionale Parameter, mit denen sich das Verhalten des Algorithmus ändern lässt. Die Ausgabe ist ein Verschiebungsbild mit den Bändern dx und dy, die die X‑ und Y‑Komponenten (in Metern) des Verschiebungsvektors an jedem Pixel angeben.

Alle Bänder der Aufruf- und Referenzbilder werden bei der Registrierung zum Abgleich verwendet. Die Anzahl der Bänder muss also genau gleich sein. Die Eingabebänder müssen visuell ähnlich sein, damit die Registrierung erfolgreich ist. Falls nicht, können Sie sie möglicherweise vorverarbeiten (z.B. glätten, Kantenerkennung), damit sie ähnlicher aussehen. Die Registrierungsberechnungen werden mit einem mehrstufigen, grob-zu-feinen Prozess mit (mehrstufigen) Arbeitsprojektionen durchgeführt, die von drei der dem Algorithmus bereitgestellten Projektionen abhängen:

  1. die Standardprojektion des anrufenden Bildes (Pc)
  2. die Standardprojektion des Referenzbilds (Pr)
  3. die Ausgabeprojektion (Po)

Die Arbeitsprojektion mit der höchsten Auflösung (Pw) befindet sich im CRS von Pr in einem Maßstab, der durch die gröbste Auflösung dieser drei Projektionen bestimmt wird, um die Berechnung zu minimieren. Die Ergebnisse von Pr werden dann so neu abgetastet, dass sie der vom Eingabeparameter „projection“ angegebenen Projektion entsprechen.

Die Ausgabe ist ein Verschiebungsbild mit den folgenden Bändern:

dx
Für einen bestimmten Pixelstandort im Referenzbild enthält dieses Band den Abstand in X-Richtung, der zurückgelegt werden muss, um den entsprechenden Ort im aufgerufenen Bild zu erreichen. Die Einheiten sind in geodätischen Metern.
dy
Für einen bestimmten Pixelstandort im Referenzbild enthält dieses Band den Abstand in Y-Richtung, der zurückgelegt werden muss, um den entsprechenden Ort im aufgerufenen Bild zu erreichen. Die Einheiten sind in geodätischen Metern.
confidence
Dies ist eine Schätzung der Verschiebungswahrscheinlichkeit pro Pixel (0 steht für geringe und 1 für hohe Wahrscheinlichkeit). Sie basiert auf den Korrelationswerten in Regionen, in denen gültige Übereinstimmungen gefunden wurden. In Regionen, in denen keine Übereinstimmungen gefunden wurden, wird die Konfidenz anhand der Korrelationen in der Nähe mithilfe eines Gaußschen Kerns geschätzt, um benachbarte Korrelationen stärker zu gewichten.

Im folgenden Beispiel werden die Größe und der Winkel der Verschiebung zwischen zwei hochauflösenden Terra Bella-Bildern berechnet:

Code-Editor (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);

Bilder verzerren

Es gibt zwei Möglichkeiten, ein Bild so zu verzerren, dass es einem anderen Bild entspricht: displace() oder register(). Der displace()-Algorithmus nimmt ein Verschiebungsbild mit dx- und dy-Bändern als erste beiden Bänder und verformt das Bild entsprechend. Das Ausgabebild entsteht durch Verbiegen der Bänder des Eingabebilds um die Verschiebungen im Verschiebungsbild. Mit den im vorherigen Beispiel berechneten Verschiebungen:

Code-Editor (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');

Wenn Sie die Verschiebungsbänder nicht benötigen, bietet Earth Engine die Methode register(). Dies ist eine Verknüpfung für den Aufruf von displacement() gefolgt von displace(). Beispiel:

Code-Editor (JavaScript)

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

In diesem Beispiel unterscheiden sich die Ergebnisse von register() von den Ergebnissen von displace(). Das liegt daran, dass in den beiden Ansätzen unterschiedliche Bänder verwendet wurden: Bei register() werden immer alle Bänder der Eingabebilder verwendet, während im Beispiel displacement() nur der rote Streifen verwendet wurde, bevor das Ergebnis an displace() übergeben wurde. Wenn mehrere Bänder verwendet werden und die Bandvarianzen sehr unterschiedlich sind, kann dies dazu führen, dass die Bänder mit hoher Varianz übergewichtet werden, da die Bänder gemeinsam normalisiert werden, wenn ihre Bewertungen der räumlichen Korrelation kombiniert werden. Das zeigt, wie wichtig es ist, bei der Registrierung die visuell ähnlichsten Bänder auszuwählen. Wie im vorherigen Beispiel können Sie mit displacement() und displace() festlegen, welche Bänder zur Berechnung der Verschiebung verwendet werden.