Como registrar imagens

O algoritmo de registro de imagem do Earth Engine foi projetado para ser uma etapa final, pós-ortogonal e detalhada no alinhamento de imagens. Supõe-se que as imagens a serem registradas já passaram pelos estágios iniciais de alinhamento, então elas já estão dentro de alguns graus de rotação umas das outras e diferem apenas por pequenas traduções. O registro usa uma técnica de "folha de borracha", permitindo que a distorção de imagem local seja corrigida para erros de ortorretificação e outros artefatos de processamento anterior. A técnica de alinhamento subjacente é a correlação de imagens. Portanto, as bandas das imagens de entrada e de referência precisam ser visualmente semelhantes para que o algoritmo calcule um alinhamento preciso.

Deslocamento da imagem

Há duas etapas para registrar uma imagem: determinar a imagem de deslocamento usando displacement() e, em seguida, aplicá-la com displace(). As entradas necessárias são o par de imagens a serem registradas e um parâmetro de deslocamento máximo (maxOffset).

O algoritmo displacement() usa uma imagem de referência, um parâmetro de deslocamento máximo (maxOffset) e dois parâmetros opcionais que modificam o comportamento do algoritmo. A saída é uma imagem de deslocamento com bandas dx e dy, que fornecem os componentes X e Y (em metros) do vetor de deslocamento em cada pixel.

Todas as bandas das imagens de chamada e de referência são usadas para correspondência durante o registro. Portanto, o número de bandas precisa ser exatamente igual. As faixas de entrada precisam ser visualmente semelhantes para que o registro seja bem-sucedido. Se esse não for o caso, talvez seja possível pré-processá-los (por exemplo, suavização, detecção de bordas) para que eles fiquem mais semelhantes. As computações de registro são realizadas usando um processo multiescala, de grosseiro a fino, com projeções de trabalho (multiescala) que dependem de três das projeções fornecidas ao algoritmo:

  1. a projeção padrão da imagem de chamada (Pc).
  2. a projeção padrão da imagem de referência (Pr).
  3. a projeção de saída (Po).

A projeção de trabalho de maior resolução (Pw) vai estar no CRS de Pr, em uma escala determinada pela resolução mais grosseira dessas três projeções, para minimizar o cálculo. Os resultados de Pr são amostrados novamente para estar na projeção especificada pelo parâmetro de entrada "projection".

A saída é uma imagem de deslocamento com as seguintes faixas:

dx
Para um determinado local de pixel de imagem de referência, essa faixa contém a distância na direção X que precisa ser percorrida para chegar ao local correspondente na imagem de chamada. As unidades estão em metros geodésicos.
dy
Para um determinado local de pixel de imagem de referência, essa faixa contém a distância na direção Y que precisa ser percorrida para chegar ao local correspondente na imagem de chamada. As unidades estão em metros geodésicos.
confidence
Esta é uma estimativa por pixel da confiança de deslocamento (em que 0 é baixa confiança e 1 é alta confiança) com base nas pontuações de correlação em regiões em que foram encontradas correspondências válidas. Em regiões em que nenhuma correspondência foi encontrada, a confiança é estimada a partir de correlações próximas usando um kernel Gaussiano para dar maior peso às correlações próximas.

O exemplo a seguir calcula a magnitude e o ângulo de deslocamento entre duas imagens de alta resolução da Terra Bella:

Editor de código (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);

Distorção de uma imagem

Há duas maneiras de distorcer uma imagem para que ela corresponda a outra: displace() ou register(). O algoritmo displace() usa uma imagem de deslocamento com bandas dx e dy como as duas primeiras bandas e deforma a imagem de acordo com isso. A imagem de saída será o resultado da distorção das bandas da imagem de entrada pelos deslocamentos presentes na imagem de deslocamento. Usando os deslocamentos calculados no exemplo anterior:

Editor de código (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 você não precisar das faixas de deslocamento, o Earth Engine oferece o método register(), que é um atalho para chamar displacement() seguido por displace(). Exemplo:

Editor de código (JavaScript)

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

Neste exemplo, os resultados de register() são diferentes dos resultados de displace(). Isso ocorre porque um conjunto diferente de bandas foi usado nas duas abordagens: register() sempre usa todas as bandas das imagens de entrada, enquanto o exemplo displacement() usou apenas a banda vermelha antes de alimentar o resultado para displace(). Quando várias faixas são usadas, se as variações forem muito diferentes, isso poderá dar mais peso às faixas de alta variação, já que elas são normalizadas em conjunto quando as pontuações de correlação espacial são combinadas. Isso ilustra a importância de selecionar as bandas que são visualmente mais semelhantes ao fazer o registro. Como no exemplo anterior, use displacement() e displace() para controlar quais bandas são usadas para calcular o deslocamento.