Композиция, маскирование и мозаика

Загрузив коллекцию отражательной способности Landsat 8 TOA в переменную l8 , вы увидели, что следующий код приводит к созданию композита недавних значений:

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

var l8 = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA');
var landsat2016 = l8.filterDate('2016-01-01', '2016-12-31');
Map.addLayer(landsat2016, visParams, 'l8 collection');

Одна из проблем с этой композицией заключается в том, что она полна облаков. Вместо того, чтобы просто брать последний пиксель в коллекции (когда вы добавляете коллекцию на карту, Earth Engine неявно вызывает для неё mosaic() ), вы можете уменьшить коллекцию ImageCollection ( Подробнее об уменьшении коллекций изображений ).

Композиция с редукторами

Впервые вы познакомились с редукторами для получения статистики в области изображения . Это была пространственная редукция. Редукция коллекции изображений в одно изображение — это временная редукция, когда коллекция представляет изображения, изменяющиеся во времени. Тип используемого Reducer определяет, как Earth Engine обрабатывает перекрывающиеся пиксели. Landsat 8 посещает одну и ту же точку на Земле каждые 16 дней. Это означает, что за 6 месяцев будет получено примерно 12 изображений (и больше в местах перекрытия сцен). Каждый пиксель на карте формируется из набора пикселей — по одному с каждого изображения в отображаемой коллекции.

Простое добавление коллекции на карту приводит к выбору самого последнего пикселя — пикселя из последнего изображения в стеке. Это поведение можно изменить с помощью редукторов Earth Engine. Например, вместо того, чтобы выбирать самый последний пиксель из стека, Earth Engine можно указать выбрать медианное значение в стеке. Это позволяет удалить облака (с высоким значением) и тени (с низким значением). При уменьшении коллекции изображений с помощью редуктора медианы составное значение представляет собой медиану в каждом канале с течением времени. Например, для сцен Landsat за 2016 год:

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

// Get the median over time, in each band, in each pixel.
var median = l8.filterDate('2016-01-01', '2016-12-31').median();

// Make a handy variable of visualization parameters.
var visParams = {bands: ['B4', 'B3', 'B2'], max: 0.3};

// Display the median composite.
Map.addLayer(median, visParams, 'median');

Новым в этом коде является метод median() применяемый к коллекции изображений. Как и методы фильтрации, это сокращение для более общего метода reduce() для коллекций изображений, принимающего в качестве аргумента ee.Reducer() . Список всех редукторов Earth Engine см. в описании пакета ee.Reducer на вкладке «Документация» редактора кода. При выборе редуктора для коллекции изображений обратите внимание, что выходными данными является изображение, поэтому редукторы с нечисловыми выходными данными, например, редукторы histogram или toList , не будут работать с коллекцией изображений.

Tutorial_api_06_median_composite
Рисунок 6. Медианный композит Landsat 8.

При уменьшении масштаба медианного композита вы должны увидеть что-то вроде рисунка 6. Это должно выглядеть значительно лучше, чем недавний композит значений, который вы сделали ранее. На этом этапе стоит сделать шаг назад и рассмотреть, что было сделано для создания этого медианного композита. Earth Engine загрузил всю коллекцию Landsat 8 по континентальной части США и рассчитал медиану для каждого пикселя. Это очень много данных! Конечно, вы можете вычислить годовые медианы, предварительно отфильтровав коллекцию, как вы делали ранее . Дело в том, что если бы вам пришлось загружать все эти снимки и создавать этот композит, это был бы большой проект. С Earth Engine вы получаете результат за считанные секунды!

Подробнее о композиции и мозаике можно узнать здесь .

Маскировка

Хотя медианный композитный метод является улучшением по сравнению с композитным методом на основе недавних значений, может возникнуть необходимость замаскировать части изображения. Маскирование пикселей на изображении делает их прозрачными и исключает их из анализа. Каждый пиксель в каждой полосе изображения имеет маску. Пиксели со значением маски 0 или ниже будут прозрачными. Пиксели со значением маски выше 0 будут визуализированы. Маска изображения задаётся с помощью вызова типа image1.mask(image2) . Этот вызов принимает значения image2 и делает их маской для image1 . Все пиксели в image2 со значением 0 будут сделаны прозрачными в image1 .

Например, предположим, что вы хотите замаскировать все пиксели воды в медианном композите. Маску воды можно создать с помощью набора данных, описанного Хансеном и др. (2013) , который находится в каталоге данных Earth Engine. (Подробнее о наборе данных Хансена и др. читайте в этом руководстве .) В этом наборе данных вода имеет значение 2, суша — значение 1, а «нет данных» — значение 0. Используйте немного логики, чтобы создать маску с нулями там, где нет суши:

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

// Load or import the Hansen et al. forest change dataset.
var hansenImage = ee.Image('UMD/hansen/global_forest_change_2015');

// Select the land/water mask.
var datamask = hansenImage.select('datamask');

// Create a binary mask.
var mask = datamask.eq(1);

// Update the composite mask with the water mask.
var maskedComposite = median.updateMask(mask);
Map.addLayer(maskedComposite, visParams, 'masked');

В этом коде есть пара новых функций, которые стоит рассмотреть подробнее. Во-первых, функция select() полезна для извлечения интересующих полос из изображения. Здесь мы выбираем только нужную полосу: datamask . Следующее нововведение — логический оператор eq() , который означает «равно». Мы используем eq(1) для создания бинарного изображения, в котором все пиксели, не имеющие значения 1 в полосе datamask (т.е. представляющие собой воду или не содержащие данных), получают значение 0 в результирующем изображении.

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

Мозаика

Комбинируя концепции коллекций изображений, логических операторов, маскирования и композитинга, можно добиться интересных картографических результатов. Например, предположим, что вам нужно изображение, на котором пиксели суши отображаются в режиме True Color, а все остальные пиксели — синим цветом. Вы можете сделать следующее:

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

// Make a water image out of the mask.
var water = mask.not();

// Mask water with itself to mask all the zeros (non-water).
water = water.mask(water);

// Make an image collection of visualization images.
var mosaic = ee.ImageCollection([
  median.visualize(visParams),
  water.visualize({palette: '000044'}),
]).mosaic();

// Display the mosaic.
Map.addLayer(mosaic, {}, 'custom mosaic');

В этом коде происходит много всего, поэтому давайте разберём его. Сначала мы используем логический оператор not() для инвертирования маски, которую мы создали ранее. В частности, not() преобразует все нули в единицы, а все ненулевые значения — в нули. Называть эту переменную water не совсем корректно, поскольку она также включает в себя некоторые пиксели nodata, но в данном картографическом контексте это допустимо. Следующий шаг — замаскировать «воду» самой собой. В результате получится изображение, на котором все пиксели воды равны 1, а всё остальное замаскировано. Заключительный шаг — объединение изображений с помощью mosaic() . Поскольку mosaic() работает с коллекцией изображений, мы передаём список изображений, которые хотим объединить, в конструктор коллекции изображений, а затем вызываем mosaic() на последнем этапе. Порядок изображений в этом списке важен. В частности, выходное изображение будет содержать последний не замаскированный пиксель из набора изображений во входной коллекции. В данном случае это работает, поскольку слой с водой является последним (верхним) изображением в коллекции и содержит только немаскированные пиксели там, где есть вода.

Обратите внимание, что изображения в коллекции являются изображениями визуализации . При вызове метода visualize() изображение преобразуется в 3-канальное 8-битное изображение в соответствии с переданными параметрами визуализации. Параметры визуализации по умолчанию отлично подходят для 3-канальных 8-битных изображений, поэтому при добавлении изображения на карту параметры визуализации не требуются. Результат должен выглядеть так, как показано на рисунке 7.

Tutorial_api_07_mosaic.png
Рисунок 7. Специальная мозаика, которая придает водным областям однородный цвет.

К этому моменту вы познакомились со способами визуализации коллекций изображений в виде композитов с недавними значениями, методами создания композитов с использованием редукторов и методами создания пользовательских композитов путем маскирования и мозаики коллекции изображений. На следующей странице вы узнаете, как добавить индекс растительности к каждому изображению в коллекции и использовать его для создания композита «самый зеленый пиксель».