Статистика области изображения

reduceRegion

Для получения статистики значений пикселей в области объекта ee.Image используйте image.reduceRegion() . Эта функция преобразует все пиксели в области (областях) в статистику или другое компактное представление данных пикселей в области (например, гистограмму). Область представляется в виде Geometry , который может быть многоугольником, содержащим множество пикселей, или одной точкой, в этом случае в области будет только один пиксель. В любом случае, как показано на рисунке 1, результатом является статистика, полученная из пикселей в области.

диаграмма reduceRegion
Рисунок 1. Иллюстрация применения ee.Reducer к изображению и области.

В качестве примера получения пиксельной статистики в области изображения с помощью reduceRegion() рассмотрим поиск средних спектральных значений 5-летнего композитного изображения Landsat в пределах границ хвойного леса Сьерра-Невады (иллюстрировано на рисунке 2):

// Load input imagery: Landsat 7 5-year composite.
var image = ee.Image('LANDSAT/LE7_TOA_5YEAR/2008_2012');

// Load an input region: Sierra Nevada.
var region = ee.Feature(ee.FeatureCollection('EPA/Ecoregions/2013/L3')
  .filter(ee.Filter.eq('us_l3name', 'Sierra Nevada'))
  .first());

// Reduce the region. The region parameter is the Feature geometry.
var meanDictionary = image.reduceRegion({
  reducer: ee.Reducer.mean(),
  geometry: region.geometry(),
  scale: 30,
  maxPixels: 1e9
});

// The result is a Dictionary.  Print it.
print(meanDictionary);

Для принудительного выполнения вычислений достаточно вывести результат на экран, который редактор кода отобразит в консоли в виде Dictionary . Вывод должен выглядеть примерно так:

B1: 25.406029716816853
B2: 23.971497014238988
B3: 22.91059593763103
B4: 54.83164133293403
B5: 38.07655472573677
B6_VCID_2: 198.93216428012906
B7: 24.063261634961563
диаграмма reduceRegion
Рисунок 2. Композиционное изображение данных Landsat для Калифорнии и Невады в ложных цветах. Область, требующая коррекции, показана белым цветом.

Обратите внимание, что в этом примере уменьшение задается путем указания reducer ( ee.Reducer.mean() ), geometry ( region.geometry() ), scale (30 метров) и maxPixels для максимального количества пикселей, передаваемых на вход редуктора. Масштаб всегда следует указывать в вызовах reduceRegion() . Это связано с тем, что в сложных процессах обработки, которые могут включать данные из разных источников с разными масштабами, масштаб выходных данных не будет однозначно определен из входных данных. В этом случае масштаб по умолчанию равен 1 градусу, что обычно приводит к неудовлетворительным результатам. Дополнительную информацию о том, как Earth Engine обрабатывает масштаб, см. на этой странице .

Существует два способа задать масштаб: указать параметр scale или указать систему координат и преобразование системы координат. (См. глоссарий для получения дополнительной информации о системах координат и преобразованиях системы координат). Например, приведенное выше сокращение meanDictionary эквивалентно следующему:

// As an alternative to specifying scale, specify a CRS and a CRS transform.
// Make this array by constructing a 4326 projection at 30 meters,
// then copying the bounds of the composite, from composite.projection().
var affine = [0.00026949458523585647, 0, -180, 0, -0.00026949458523585647, 86.0000269494563];

// Perform the reduction, print the result.
print(image.reduceRegion({
  reducer: ee.Reducer.mean(),
  geometry: region.geometry(),
  crs: 'EPSG:4326',
  crsTransform: affine,
  maxPixels: 1e9
}));

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

Пиксели в регионе

Пиксели определяются как находящиеся в заданной области (и им присваивается соответствующий вес) в соответствии со следующими правилами, применяемыми в указанном масштабе и проекции:

  • Невзвешенные редукторы (например, ee.Reducer.count() или ee.Reducer.mean().unweighted() ): пиксели включаются, если их центроид находится в заданной области и маска изображения не равна нулю.
  • Взвешенные редукторы (например, ee.Reducer.mean() ): пиксели включаются, если по крайней мере (приблизительно) 1/256 (~0,4%) пикселя находится в области, и маска изображения не равна нулю; их вес равен минимуму из маски изображения и (приблизительной) доли пикселя, покрытой областью. Веса пересечения пикселей внутренне представлены в виде 8-битных целых чисел (от 0 до 255), квантуя долю покрытия на 256 дискретных уровней.

Параметр maxPixels необходим для успешного выполнения вычислений. Если этот параметр отсутствует в примере, возвращается ошибка, которая выглядит примерно так:

Существует несколько способов обойти эти ошибки: увеличить значение maxPixels , как в примере, увеличить scale или установить значение bestEffort равным true, что автоматически вычислит новый (больший) масштаб таким образом, чтобы maxPixels не было превышено. Если вы не укажете maxPixels , будет использовано значение по умолчанию.