Registrazione delle immagini

L'algoritmo di registrazione delle immagini di Earth Engine è progettato per essere un passaggio finale post-orto e granulare per l'allineamento delle immagini. Si presume che le immagini da registrare abbiano già superato le fasi di allineamento iniziali, quindi sono già a pochi gradi di rotazione l'una dall'altra e differiscono solo per piccole traslazioni. La registrazione utilizza una tecnica "a foglio di gomma", che consente di correggere le deformazioni locali delle immagini per gli errori di ortorettificazione e altri artefatti dell'elaborazione precedente. La tecnica di allineamento sottostante è la correlazione delle immagini, pertanto le bande per le immagini di input e di riferimento devono essere visivamente simili affinché l'algoritmo calcoli un allineamento preciso.

Spostamento dell'immagine

Per registrare un'immagine sono necessari due passaggi: determinare l'immagine di spostamento utilizzando displacement() e poi applicarla con displace(). Gli input obbligatori sono la coppia di immagini da registrare e un parametro di spostamento massimo (maxOffset).

L'algoritmo displacement() prende un'immagine di riferimento, un parametro di spostamento massimo (maxOffset) e due parametri facoltativi che modificano il comportamento dell'algoritmo. L'output è un'immagine di spostamento con bande dx e dy che forniscono i componenti X e Y (in metri) del vettore di spostamento in ogni pixel.

Tutte le bande delle immagini di chiamata e di riferimento vengono utilizzate per la corrispondenza durante la registrazione, pertanto il numero di bande deve essere esattamente uguale. Affinché la registrazione vada a buon fine, le bande di input devono essere simili visivamente. In caso contrario, potrebbe essere possibile pre-trattarle (ad es. smussamento, rilevamento dei bordi) per renderle più simili. I calcoli di registrazione vengono eseguiti utilizzando un procedura da approssimativa a precisa a più scale, con proiezioni di lavoro (multiscala) che dipendono da tre delle proiezioni fornite all'algoritmo:

  1. la proiezione predefinita dell'immagine di chiamata (Pc)
  2. la proiezione predefinita dell'immagine di riferimento (Pr)
  3. la proiezione dell'output (Po)

La proiezione di lavoro con la risoluzione più alta (Pw) sarà nel sistema di riferimento cartografico di Pr, a una scala determinata dalla risoluzione più approssimativa di queste 3 proiezioni, per ridurre al minimo i calcoli. I risultati di Pr vengono poi sottoposti a riesampling in modo da rientrare nella proiezione specificata dal parametro di input "projection".

L'output è un'immagine di spostamento con i seguenti intervalli:

dx
Per una determinata posizione del pixel dell'immagine di riferimento, questa banda contiene la distanza in direzione X che deve essere percorsa per raggiungere la posizione corrispondente nell'immagine chiamata. Le unità di misura sono in metri geodetici.
dy
Per una determinata posizione del pixel dell'immagine di riferimento, questa banda contiene la distanza in direzione Y che deve essere percorsa per raggiungere la posizione corrispondente nell'immagine di chiamata. Le unità di misura sono in metri geodetici.
confidence
Si tratta di una stima per pixel dell'affidabilità del movimento (dove 0 rappresenta un'affidabilità bassa e 1 un'affidabilità elevata) in base ai punteggi di correlazione nelle regioni in cui sono state trovate corrispondenze valide. Nelle regioni in cui non sono state trovate corrispondenze, l'affidabilità viene stimata dalle correlazioni vicine utilizzando un nucleo Gaussiano per dare un maggiore peso alle correlazioni vicine.

L'esempio seguente calcola l'intensità e l'angolo di spostamento tra due immagini Terra Bella ad alta risoluzione:

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

Deformare un'immagine

Esistono due modi per deformare un'immagine in modo che corrisponda a un'altra: displace() o register(). L'algoritmo displace() prende un'immagine di spostamento con bande dx e dy come prime due bande e la deforma di conseguenza. L'immagine di output sarà il risultato della distorsione delle bande dell'immagine di input in base agli offset presenti nell'immagine di spostamento. Utilizzando i scostamenti calcolati nell'esempio precedente:

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

Se non hai bisogno delle bande di spostamento, Earth Engine fornisce il metodo register(), che è una scorciatoia per chiamare displacement() seguita da displace(). Ad esempio:

Editor di codice (JavaScript)

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

In questo esempio, i risultati di register() sono diversi da quelli di displace(). Questo accade perché nei due approcci è stato utilizzato un insieme diverso di bande: register() utilizza sempre tutte le bande delle immagini di input, mentre l'esempio displacement() utilizzava solo la banda rossa prima di inviare il risultato a displace(). Tieni presente che, se vengono utilizzate più bande, se le varianze delle bande sono molto diverse, questo potrebbe dare un peso eccessivo alle bande ad alta varianza, poiché le bande vengono normalizzate congiuntamente quando i relativi punteggi di correlazione spaziale vengono combinati. Questo illustra l'importanza di selezionare le bande più simili dal punto di vista visivo durante la registrazione. Come nell'esempio precedente, utilizza displacement() e displace() per controllare le bande utilizzate per calcolare lo spostamento.