El algoritmo de registro de imágenes de Earth Engine está diseñado para ser un paso final detallado posortométrico en la alineación de imágenes. Se supone que las imágenes que se registrarán ya pasaron por las etapas de alineación iniciales, por lo que ya están dentro de unos pocos grados de rotación entre sí y solo difieren en traducciones pequeñas. El registro usa una técnica de "hoja de goma", lo que permite la deformación de imágenes locales para corregir errores de ortorectificación y otros artefactos del procesamiento anterior. La técnica de alineación subyacente es la correlación de imágenes, por lo que las bandas de las imágenes de entrada y de referencia deben ser visualmente similares para que el algoritmo calcule una alineación precisa.
Desplazamiento de imagen
El registro de una imagen consta de dos pasos: determinar la imagen de desplazamiento con displacement()
y, luego, aplicarla con displace()
. Las entradas requeridas son el par de imágenes que se registrarán y un parámetro de desplazamiento máximo (maxOffset
).
El algoritmo displacement()
toma una imagen de referencia, un parámetro de desplazamiento máximo (maxOffset
) y dos parámetros opcionales que modifican el comportamiento del algoritmo. El resultado es una imagen de desplazamiento con bandas dx
y dy
que proporcionan los componentes X e Y (en metros) del vector de desplazamiento en cada píxel.
Todas las bandas de las imágenes de llamada y de referencia se usan para la coincidencia durante el registro, por lo que la cantidad de bandas debe ser exactamente igual. Las bandas de entrada deben ser visualmente similares para que el registro se realice correctamente. Si no es así, es posible preprocesarlas (p.ej., suavizar, detectar bordes) para que se vean más similares. Los cálculos de registro se realizan con un proceso multiescala de grueso a fino, con proyecciones de trabajo (multiescala) que dependen de tres de las proyecciones proporcionadas al algoritmo:
- la proyección predeterminada de la imagen de llamada (Pc)
- la proyección predeterminada de la imagen de referencia (Pr)
- la proyección de salida (Po)
La proyección de trabajo de mayor resolución (Pw) estará en el CRS de Pr, en una escala determinada por la resolución más gruesa de estas 3 proyecciones, para minimizar el procesamiento. Luego, se vuelve a muestrear los resultados de Pr para que estén en la proyección especificada por el parámetro de entrada "projection".
El resultado es una imagen de desplazamiento con las siguientes bandas:
dx
- Para una ubicación de píxeles de imagen de referencia determinada, esta banda contiene la distancia en la dirección X que se debe recorrer para llegar a la ubicación coincidente en la imagen de llamada. Las unidades se expresan en metros geodésicos.
dy
- Para una ubicación de píxeles de imagen de referencia determinada, esta banda contiene la distancia en la dirección Y que se debe recorrer para llegar a la ubicación coincidente en la imagen de llamada. Las unidades se expresan en metros geodésicos.
confidence
- Esta es una estimación por píxel de la confianza del desplazamiento (en la que 0 es baja y 1 es alta) según las puntuaciones de correlación en las regiones donde se encontraron coincidencias válidas. En las regiones donde no se encontraron coincidencias, la confianza se estima a partir de correlaciones cercanas con un kernel gaussiano para proporcionar un mayor peso a las correlaciones cercanas.
En el siguiente ejemplo, se calcula la magnitud y el ángulo de desplazamiento entre dos imágenes de Terra Bella de alta resolución:
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);
Cómo deformar una imagen
Existen dos maneras de deformar una imagen para que coincida con otra: displace()
o register()
. El algoritmo displace()
toma una imagen de desplazamiento que tiene bandas dx
y dy
como las dos primeras bandas y deforma la imagen según corresponda. La imagen de salida será el resultado de deformar las bandas de la imagen de entrada por los desplazamientos presentes en la imagen de desplazamiento. Con los desplazamientos calculados en el ejemplo 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');
Si no necesitas las bandas de desplazamiento, Earth Engine proporciona el método register()
, que es un atajo para llamar a displacement()
seguido de displace()
. Por ejemplo:
Editor de código (JavaScript)
var alsoRegistered = image2Orig.register({ referenceImage: image1Orig, maxOffset: 50.0, patchWidth: 100.0 }); Map.addLayer(alsoRegistered, visParams, 'Also Registered');
En este ejemplo, los resultados de register()
difieren de los resultados de displace()
. Esto se debe a que se usó un conjunto diferente de bandas en los dos enfoques: register()
siempre usa todas las bandas de las imágenes de entrada, mientras que el ejemplo de displacement()
solo usó la banda roja antes de enviar el resultado a displace()
. Ten en cuenta que, cuando se usan varias bandas, si las varianzas de las bandas son muy diferentes, esto podría sobreponderar las bandas de alta varianza, ya que las bandas se normalizan de forma conjunta cuando se combinan sus puntuaciones de correlación espacial. Esto ilustra la importancia de seleccionar las bandas que sean visualmente las más similares cuando te registres. Al igual que en el ejemplo anterior, usa displacement()
y displace()
para controlar qué bandas se usan para calcular el desplazamiento.