Регистрация изображений

Алгоритм регистрации изображений Earth Engine предназначен для окончательного, пост-орто, мелкозернистого этапа выравнивания изображений. Предполагается, что изображения, подлежащие регистрации, уже прошли начальные этапы выравнивания, поэтому они уже находятся в пределах нескольких градусов поворота друг от друга и отличаются лишь небольшими перемещениями. При регистрации используется метод «резинового листа», позволяющий локально деформировать изображение для исправления ошибок ортотрансформации и других артефактов предыдущей обработки. Базовым методом выравнивания является корреляция изображений, поэтому полосы входного и эталонного изображений должны быть визуально похожими, чтобы алгоритм мог вычислить точное выравнивание.

Смещение изображения

Регистрация изображения состоит из двух шагов: определение изображения смещения с помощью displacement() и последующее применение его с помощью displace() . Обязательными входными данными являются пара изображений для регистрации и параметр максимального смещения ( maxOffset ).

Алгоритм displacement() принимает эталонное изображение, параметр максимального смещения ( maxOffset ) и два дополнительных параметра, которые изменяют поведение алгоритма. Результатом является изображение смещения с полосами dx и dy , которые дают компоненты X и Y (в метрах) вектора смещения в каждом пикселе.

Все каналы вызывающего и опорного изображений используются для сопоставления при регистрации, поэтому количество каналов должно быть точно равным. Для успешной регистрации входные полосы должны быть визуально похожими. Если это не так, их можно предварительно обработать (например, сгладить, обнаружить края), чтобы они выглядели более похожими. Вычисления регистрации выполняются с использованием многомасштабного процесса от грубого к точному с (многомасштабными) рабочими проекциями, которые зависят от трех проекций, подаваемых в алгоритм:

  1. проекция вызывающего изображения по умолчанию ( P c )
  2. проекция эталонного изображения по умолчанию ( P r )
  3. выходная проекция ( P o )

Рабочая проекция с самым высоким разрешением ( P w будет находиться в CRS Pr в масштабе, определяемом самым грубым разрешением этих трех проекций, чтобы минимизировать вычисления. Затем результаты Pr повторно дискретизируются, чтобы оказаться в проекции, указанной входным параметром «проекция».

На выходе получается изображение смещения со следующими полосами:

dx
Для данного местоположения пикселя эталонного изображения эта полоса содержит расстояние в направлении X, которое необходимо пройти, чтобы достичь соответствующего местоположения на вызывающем изображении. Единицы измерения — геодезические метры.
dy
Для данного местоположения пикселя эталонного изображения эта полоса содержит расстояние в направлении Y, которое необходимо пройти, чтобы достичь соответствующего местоположения на вызывающем изображении. Единицы измерения — геодезические метры.
confidence
Это попиксельная оценка достоверности смещения (где 0 — низкая достоверность, а 1 — высокая достоверность), основанная на показателях корреляции в регионах, где были найдены действительные совпадения. В регионах, где совпадений не обнаружено, достоверность оценивается на основе близлежащих корреляций с использованием ядра Гаусса, чтобы придать более высокий вес близким корреляциям.

В следующем примере вычисляются величина и угол смещения между двумя изображениями Terra Bella с высоким разрешением:

Редактор кода (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);

Деформация изображения

Есть два способа деформировать изображение, чтобы оно соответствовало другому изображению: displace() или register() . Алгоритм displace() принимает изображение смещения, имеющее полосы dx и dy в качестве первых двух полос, и соответствующим образом деформирует изображение. Выходное изображение будет результатом деформации полос входного изображения смещениями, присутствующими в изображении смещения. Используя смещения, вычисленные в предыдущем примере:

Редактор кода (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');

Если вам не нужны полосы смещения, Earth Engine предоставляет метод register() , который представляет собой ярлык для вызова displacement() за которым следует displace() . Например:

Редактор кода (JavaScript)

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

В этом примере результаты register() отличаются от результатов displace() . Это связано с тем, что в двух подходах использовался разный набор полос: register() всегда использует все полосы входных изображений, тогда как пример displacement() использовал только красную полосу перед подачей результата в displace() . Обратите внимание, что при использовании нескольких диапазонов, если дисперсии диапазонов сильно различаются, это может привести к избыточному весу диапазонов с высокой дисперсией, поскольку каналы совместно нормализуются при объединении их оценок пространственной корреляции. Это иллюстрирует важность выбора диапазонов, которые визуально наиболее похожи при регистрации. Как и в предыдущем примере, используйте displacement() и displace() для управления тем, какие полосы используются для вычисления смещения.