Объектно-ориентированные методы,Объектно-ориентированные методы

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

Earth Engine предлагает методы для маркировки каждого объекта уникальным идентификатором, подсчета количества пикселей, составляющих объекты, и вычисления статистики для значений пикселей, пересекающих объекты.

  • connectedComponents() : пометьте каждый объект уникальным идентификатором.
  • connectedPixelCount() : вычисляет количество пикселей в каждом объекте.
  • reduceConnectedComponents() : вычислить статистику для пикселей в каждом объекте.

Термальные точки доступа

В следующих разделах представлены примеры объектно-ориентированных методов, применяемых к температуре поверхности Landsat 8, причем каждый раздел основан на первом. Запустите следующий фрагмент, чтобы создать базовое изображение: тепловые точки (> 303 градусов Кельвина) для небольшого региона Сан-Франциско.

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

// Make an area of interest geometry centered on San Francisco.
var point = ee.Geometry.Point(-122.1899, 37.5010);
var aoi = point.buffer(10000);

// Import a Landsat 8 image, subset the thermal band, and clip to the
// area of interest.
var kelvin = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318')
  .select(['B10'], ['kelvin'])
  .clip(aoi);

// Display the thermal band.
Map.centerObject(point, 13);
Map.addLayer(kelvin, {min: 288, max: 305}, 'Kelvin');

// Threshold the thermal band to set hot pixels as value 1, mask all else.
var hotspots = kelvin.gt(303)
  .selfMask()
  .rename('hotspots');

// Display the thermal hotspots on the Map.
Map.addLayer(hotspots, {palette: 'FF0000'}, 'Hotspots');

Настройка Python

См. страницу «Среда Python» для получения информации об API Python и использовании geemap для интерактивной разработки.

import ee
import geemap.core as geemap

Колаб (Питон)

# Make an area of interest geometry centered on San Francisco.
point = ee.Geometry.Point(-122.1899, 37.5010)
aoi = point.buffer(10000)

# Import a Landsat 8 image, subset the thermal band, and clip to the
# area of interest.
kelvin = (
    ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318')
    .select(['B10'], ['kelvin'])
    .clip(aoi)
)

# Threshold the thermal band to set hot pixels as value 1, mask all else.
hotspots = kelvin.gt(303).selfMask().rename('hotspots')

# Define a map centered on Redwood City, California.
map_objects = geemap.Map(center=[37.5010, -122.1899], zoom=13)

# Add the image layers to the map.
map_objects.add_layer(kelvin, {'min': 288, 'max': 305}, 'Kelvin')
map_objects.add_layer(hotspots, {'palette': 'FF0000'}, 'Hotspots')

Рисунок 1. Температура в районе Сан-Франциско. Пиксели с температурой выше 303 градусов Кельвина выделяются красным цветом (термальные точки).

Маркировать объекты

Маркировка объектов часто является первым шагом в анализе объектов. Здесь функция connectedComponents() используется для идентификации объектов изображения и присвоения каждому уникального идентификатора; всем пикселям, принадлежащим объекту, присваивается одно и то же целочисленное значение идентификатора. Результатом является копия входного изображения с дополнительной полосой «меток», связывающей пиксели со значением идентификатора объекта на основе связности пикселей в первой полосе изображения.

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

// Uniquely label the hotspot image objects.
var objectId = hotspots.connectedComponents({
  connectedness: ee.Kernel.plus(1),
  maxSize: 128
});

// Display the uniquely ID'ed objects to the Map.
Map.addLayer(objectId.randomVisualizer(), null, 'Objects');

Настройка Python

См. страницу «Среда Python» для получения информации об API Python и использовании geemap для интерактивной разработки.

import ee
import geemap.core as geemap

Колаб (Питон)

# Uniquely label the hotspot image objects.
object_id = hotspots.connectedComponents(
    connectedness=ee.Kernel.plus(1), maxSize=128
)

# Add the uniquely ID'ed objects to the map.
map_objects.add_layer(object_id.randomVisualizer(), None, 'Objects')

Обратите внимание, что максимальный размер патча установлен на уровне 128 пикселей; объекты, состоящие из большего количества пикселей, маскируются. Соединение определяется ядром ee.Kernel.plus(1) , которое определяет соединение с четырьмя соседями; используйте ee.Kernel.square(1) для восьми соседей.


Рисунок 2. Объекты тепловых точек, помеченные и оформленные уникальным идентификатором.

Размер объекта

Количество пикселей

Подсчитайте количество пикселей, составляющих объекты, с помощью метода изображения connectedPixelCount() . Знание количества пикселей в объекте может быть полезно для маскировки объектов по размеру и расчета площади объекта. Следующий фрагмент применяет connectedPixelCount() к полосе «метки» изображения objectId , определенного в предыдущем разделе.

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

// Compute the number of pixels in each object defined by the "labels" band.
var objectSize = objectId.select('labels')
  .connectedPixelCount({
    maxSize: 128, eightConnected: false
  });

// Display object pixel count to the Map.
Map.addLayer(objectSize, null, 'Object n pixels');

Настройка Python

См. страницу «Среда Python» для получения информации об API Python и использовании geemap для интерактивной разработки.

import ee
import geemap.core as geemap

Колаб (Питон)

# Compute the number of pixels in each object defined by the "labels" band.
object_size = object_id.select('labels').connectedPixelCount(
    maxSize=128, eightConnected=False
)

# Add the object pixel count to the map.
map_objects.add_layer(object_size, None, 'Object n pixels')

connectedPixelCount() возвращает копию входного изображения, где каждый пиксель каждой полосы содержит количество подключенных соседей в соответствии с правилом соединения с четырьмя или восемью соседями, определяемым логическим аргументом, передаваемым в параметр eightConnected . Обратите внимание, что связность определяется независимо для каждого канала входного изображения. В этом примере в качестве входных данных было предоставлено одноканальное изображение ( objectId ), представляющее идентификатор объекта, поэтому одноканальное изображение было возвращено с полосой «меток» (присутствующей как таковая во входном изображении), но теперь значения представляют количество пикселей, составляющих объекты; каждый пиксель каждого объекта будет иметь одинаковое значение количества пикселей.


Рисунок 3. Объекты тепловых точек с маркировкой и стилем по размеру.

Область

Вычислите площадь объекта, умножив площадь одного пикселя на количество пикселей, составляющих объект (определяется методом connectedPixelCount() ). Площадь пикселя предоставляется изображением, сгенерированным с помощью ee.Image.pixelArea() .

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

// Get a pixel area image.
var pixelArea = ee.Image.pixelArea();

// Multiply pixel area by the number of pixels in an object to calculate
// the object area. The result is an image where each pixel
// of an object relates the area of the object in m^2.
var objectArea = objectSize.multiply(pixelArea);

// Display object area to the Map.
Map.addLayer(objectArea,
             {min: 0, max: 30000, palette: ['0000FF', 'FF00FF']},
             'Object area m^2');

Настройка Python

См. страницу «Среда Python» для получения информации об API Python и использовании geemap для интерактивной разработки.

import ee
import geemap.core as geemap

Колаб (Питон)

# Get a pixel area image.
pixel_area = ee.Image.pixelArea()

# Multiply pixel area by the number of pixels in an object to calculate
# the object area. The result is an image where each pixel
# of an object relates the area of the object in m^2.
object_area = object_size.multiply(pixel_area)

# Add the object area to the map.
map_objects.add_layer(
    object_area,
    {'min': 0, 'max': 30000, 'palette': ['0000FF', 'FF00FF']},
    'Object area m^2',
)

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

Фильтровать объекты по размеру

Размер объекта можно использовать в качестве условия маски, чтобы сосредоточить анализ на объектах определенного размера (например, замаскировать слишком маленькие объекты). Здесь изображение objectArea рассчитанное на предыдущем шаге, используется в качестве маски для удаления объектов, площадь которых меньше одного гектара.

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

// Threshold the `objectArea` image to define a mask that will mask out
// objects below a given size (1 hectare in this case).
var areaMask = objectArea.gte(10000);

// Update the mask of the `objectId` layer defined previously using the
// minimum area mask just defined.
objectId = objectId.updateMask(areaMask);
Map.addLayer(objectId, null, 'Large hotspots');

Настройка Python

См. страницу «Среда Python» для получения информации об API Python и использовании geemap для интерактивной разработки.

import ee
import geemap.core as geemap

Колаб (Питон)

# Threshold the `object_area` image to define a mask that will mask out
# objects below a given size (1 hectare in this case).
area_mask = object_area.gte(10000)

# Update the mask of the `object_id` layer defined previously using the
# minimum area mask just defined.
object_id = object_id.updateMask(area_mask)
map_objects.add_layer(object_id, None, 'Large hotspots')

Результатом является копия изображения objectId , где замаскированы объекты площадью менее одного гектара.

Рисунок 4а. Объекты тепловых точек, помеченные и стилизованные по уникальному идентификатору. Рисунок 4б. Объекты тепловых точек, отфильтрованные по минимальной площади (1 га).

Зональная статистика

Метод reduceConnectedComponents() применяет редуктор к пикселям, составляющим уникальные объекты. В следующем фрагменте он используется для расчета средней температуры объектов горячей точки. Для reduceConnectedComponents() требуется входное изображение с полосой (или полосами), которую нужно уменьшить, и полосой, определяющей метки объектов. Здесь полоса изображения «меток» objectID добавляется к изображению температуры kelvin для создания подходящего входного изображения.

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

// Make a suitable image for `reduceConnectedComponents()` by adding a label
// band to the `kelvin` temperature image.
kelvin = kelvin.addBands(objectId.select('labels'));

// Calculate the mean temperature per object defined by the previously added
// "labels" band.
var patchTemp = kelvin.reduceConnectedComponents({
  reducer: ee.Reducer.mean(),
  labelBand: 'labels'
});

// Display object mean temperature to the Map.
Map.addLayer(
  patchTemp,
  {min: 303, max: 304, palette: ['yellow', 'red']},
  'Mean temperature'
);

Настройка Python

См. страницу «Среда Python» для получения информации об API Python и использовании geemap для интерактивной разработки.

import ee
import geemap.core as geemap

Колаб (Питон)

# Make a suitable image for `reduceConnectedComponents()` by adding a label
# band to the `kelvin` temperature image.
kelvin = kelvin.addBands(object_id.select('labels'))

# Calculate the mean temperature per object defined by the previously added
# "labels" band.
patch_temp = kelvin.reduceConnectedComponents(
    reducer=ee.Reducer.mean(), labelBand='labels'
)

# Add object mean temperature to the map and display it.
map_objects.add_layer(
    patch_temp,
    {'min': 303, 'max': 304, 'palette': ['yellow', 'red']},
    'Mean temperature',
)
display(map_objects)

Результатом является копия входного изображения без полосы, используемой для определения объектов, где значения пикселей представляют собой результат уменьшения для каждого объекта в каждой полосе.


Рисунок 5. Пиксели объекта «Тепловая горячая точка», суммированные и стилизованные по средней температуре. ,

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

Earth Engine предлагает методы для маркировки каждого объекта уникальным идентификатором, подсчета количества пикселей, составляющих объекты, и вычисления статистики для значений пикселей, пересекающих объекты.

  • connectedComponents() : пометьте каждый объект уникальным идентификатором.
  • connectedPixelCount() : вычисляет количество пикселей в каждом объекте.
  • reduceConnectedComponents() : вычислить статистику для пикселей в каждом объекте.

Термальные точки доступа

В следующих разделах представлены примеры объектно-ориентированных методов, применяемых к температуре поверхности Landsat 8, причем каждый раздел основан на первом. Запустите следующий фрагмент, чтобы создать базовое изображение: тепловые точки (> 303 градусов Кельвина) для небольшого региона Сан-Франциско.

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

// Make an area of interest geometry centered on San Francisco.
var point = ee.Geometry.Point(-122.1899, 37.5010);
var aoi = point.buffer(10000);

// Import a Landsat 8 image, subset the thermal band, and clip to the
// area of interest.
var kelvin = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318')
  .select(['B10'], ['kelvin'])
  .clip(aoi);

// Display the thermal band.
Map.centerObject(point, 13);
Map.addLayer(kelvin, {min: 288, max: 305}, 'Kelvin');

// Threshold the thermal band to set hot pixels as value 1, mask all else.
var hotspots = kelvin.gt(303)
  .selfMask()
  .rename('hotspots');

// Display the thermal hotspots on the Map.
Map.addLayer(hotspots, {palette: 'FF0000'}, 'Hotspots');

Настройка Python

См. страницу «Среда Python» для получения информации об API Python и использовании geemap для интерактивной разработки.

import ee
import geemap.core as geemap

Колаб (Питон)

# Make an area of interest geometry centered on San Francisco.
point = ee.Geometry.Point(-122.1899, 37.5010)
aoi = point.buffer(10000)

# Import a Landsat 8 image, subset the thermal band, and clip to the
# area of interest.
kelvin = (
    ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318')
    .select(['B10'], ['kelvin'])
    .clip(aoi)
)

# Threshold the thermal band to set hot pixels as value 1, mask all else.
hotspots = kelvin.gt(303).selfMask().rename('hotspots')

# Define a map centered on Redwood City, California.
map_objects = geemap.Map(center=[37.5010, -122.1899], zoom=13)

# Add the image layers to the map.
map_objects.add_layer(kelvin, {'min': 288, 'max': 305}, 'Kelvin')
map_objects.add_layer(hotspots, {'palette': 'FF0000'}, 'Hotspots')

Рисунок 1. Температура в районе Сан-Франциско. Пиксели с температурой выше 303 градусов Кельвина выделяются красным цветом (термальные точки).

Маркировать объекты

Маркировка объектов часто является первым шагом в анализе объектов. Здесь функция connectedComponents() используется для идентификации объектов изображения и присвоения каждому уникального идентификатора; всем пикселям, принадлежащим объекту, присваивается одно и то же целочисленное значение идентификатора. Результатом является копия входного изображения с дополнительной полосой «меток», связывающей пиксели со значением идентификатора объекта на основе связности пикселей в первой полосе изображения.

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

// Uniquely label the hotspot image objects.
var objectId = hotspots.connectedComponents({
  connectedness: ee.Kernel.plus(1),
  maxSize: 128
});

// Display the uniquely ID'ed objects to the Map.
Map.addLayer(objectId.randomVisualizer(), null, 'Objects');

Настройка Python

См. страницу «Среда Python» для получения информации об API Python и использовании geemap для интерактивной разработки.

import ee
import geemap.core as geemap

Колаб (Питон)

# Uniquely label the hotspot image objects.
object_id = hotspots.connectedComponents(
    connectedness=ee.Kernel.plus(1), maxSize=128
)

# Add the uniquely ID'ed objects to the map.
map_objects.add_layer(object_id.randomVisualizer(), None, 'Objects')

Обратите внимание, что максимальный размер патча установлен на уровне 128 пикселей; объекты, состоящие из большего количества пикселей, маскируются. Соединение определяется ядром ee.Kernel.plus(1) , которое определяет соединение с четырьмя соседями; используйте ee.Kernel.square(1) для восьми соседей.


Рисунок 2. Объекты тепловых точек, помеченные и оформленные уникальным идентификатором.

Размер объекта

Количество пикселей

Подсчитайте количество пикселей, составляющих объекты, с помощью метода изображения connectedPixelCount() . Знание количества пикселей в объекте может быть полезно для маскировки объектов по размеру и расчета площади объекта. Следующий фрагмент применяет connectedPixelCount() к полосе «метки» изображения objectId , определенного в предыдущем разделе.

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

// Compute the number of pixels in each object defined by the "labels" band.
var objectSize = objectId.select('labels')
  .connectedPixelCount({
    maxSize: 128, eightConnected: false
  });

// Display object pixel count to the Map.
Map.addLayer(objectSize, null, 'Object n pixels');

Настройка Python

См. страницу «Среда Python» для получения информации об API Python и использовании geemap для интерактивной разработки.

import ee
import geemap.core as geemap

Колаб (Питон)

# Compute the number of pixels in each object defined by the "labels" band.
object_size = object_id.select('labels').connectedPixelCount(
    maxSize=128, eightConnected=False
)

# Add the object pixel count to the map.
map_objects.add_layer(object_size, None, 'Object n pixels')

connectedPixelCount() возвращает копию входного изображения, где каждый пиксель каждой полосы содержит количество подключенных соседей в соответствии с правилом соединения с четырьмя или восемью соседями, определяемым логическим аргументом, передаваемым в параметр eightConnected . Обратите внимание, что связность определяется независимо для каждого канала входного изображения. В этом примере в качестве входных данных было предоставлено одноканальное изображение ( objectId ), представляющее идентификатор объекта, поэтому одноканальное изображение было возвращено с полосой «меток» (присутствующей как таковая во входном изображении), но теперь значения представляют количество пикселей, составляющих объекты; каждый пиксель каждого объекта будет иметь одинаковое значение количества пикселей.


Рисунок 3. Объекты тепловых точек с маркировкой и стилем по размеру.

Область

Вычислите площадь объекта, умножив площадь одного пикселя на количество пикселей, составляющих объект (определяется методом connectedPixelCount() ). Площадь пикселя предоставляется изображением, сгенерированным с помощью ee.Image.pixelArea() .

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

// Get a pixel area image.
var pixelArea = ee.Image.pixelArea();

// Multiply pixel area by the number of pixels in an object to calculate
// the object area. The result is an image where each pixel
// of an object relates the area of the object in m^2.
var objectArea = objectSize.multiply(pixelArea);

// Display object area to the Map.
Map.addLayer(objectArea,
             {min: 0, max: 30000, palette: ['0000FF', 'FF00FF']},
             'Object area m^2');

Настройка Python

См. страницу «Среда Python» для получения информации об API Python и использовании geemap для интерактивной разработки.

import ee
import geemap.core as geemap

Колаб (Питон)

# Get a pixel area image.
pixel_area = ee.Image.pixelArea()

# Multiply pixel area by the number of pixels in an object to calculate
# the object area. The result is an image where each pixel
# of an object relates the area of the object in m^2.
object_area = object_size.multiply(pixel_area)

# Add the object area to the map.
map_objects.add_layer(
    object_area,
    {'min': 0, 'max': 30000, 'palette': ['0000FF', 'FF00FF']},
    'Object area m^2',
)

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

Фильтровать объекты по размеру

Размер объекта можно использовать в качестве условия маски, чтобы сосредоточить анализ на объектах определенного размера (например, замаскировать слишком маленькие объекты). Здесь изображение objectArea рассчитанное на предыдущем шаге, используется в качестве маски для удаления объектов, площадь которых меньше одного гектара.

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

// Threshold the `objectArea` image to define a mask that will mask out
// objects below a given size (1 hectare in this case).
var areaMask = objectArea.gte(10000);

// Update the mask of the `objectId` layer defined previously using the
// minimum area mask just defined.
objectId = objectId.updateMask(areaMask);
Map.addLayer(objectId, null, 'Large hotspots');

Настройка Python

См. страницу «Среда Python» для получения информации об API Python и использовании geemap для интерактивной разработки.

import ee
import geemap.core as geemap

Колаб (Питон)

# Threshold the `object_area` image to define a mask that will mask out
# objects below a given size (1 hectare in this case).
area_mask = object_area.gte(10000)

# Update the mask of the `object_id` layer defined previously using the
# minimum area mask just defined.
object_id = object_id.updateMask(area_mask)
map_objects.add_layer(object_id, None, 'Large hotspots')

Результатом является копия изображения objectId , где замаскированы объекты площадью менее одного гектара.

Рисунок 4а. Объекты тепловых точек, помеченные и стилизованные по уникальному идентификатору. Рисунок 4б. Объекты тепловых точек, отфильтрованные по минимальной площади (1 га).

Зональная статистика

Метод reduceConnectedComponents() применяет редуктор к пикселям, составляющим уникальные объекты. В следующем фрагменте он используется для расчета средней температуры объектов горячей точки. Для reduceConnectedComponents() требуется входное изображение с полосой (или полосами), которую нужно уменьшить, и полосой, определяющей метки объектов. Здесь полоса изображения «меток» objectID добавляется к изображению температуры kelvin для создания подходящего входного изображения.

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

// Make a suitable image for `reduceConnectedComponents()` by adding a label
// band to the `kelvin` temperature image.
kelvin = kelvin.addBands(objectId.select('labels'));

// Calculate the mean temperature per object defined by the previously added
// "labels" band.
var patchTemp = kelvin.reduceConnectedComponents({
  reducer: ee.Reducer.mean(),
  labelBand: 'labels'
});

// Display object mean temperature to the Map.
Map.addLayer(
  patchTemp,
  {min: 303, max: 304, palette: ['yellow', 'red']},
  'Mean temperature'
);

Настройка Python

См. страницу «Среда Python» для получения информации об API Python и использовании geemap для интерактивной разработки.

import ee
import geemap.core as geemap

Колаб (Питон)

# Make a suitable image for `reduceConnectedComponents()` by adding a label
# band to the `kelvin` temperature image.
kelvin = kelvin.addBands(object_id.select('labels'))

# Calculate the mean temperature per object defined by the previously added
# "labels" band.
patch_temp = kelvin.reduceConnectedComponents(
    reducer=ee.Reducer.mean(), labelBand='labels'
)

# Add object mean temperature to the map and display it.
map_objects.add_layer(
    patch_temp,
    {'min': 303, 'max': 304, 'palette': ['yellow', 'red']},
    'Mean temperature',
)
display(map_objects)

Результатом является копия входного изображения без полосы, используемой для определения объектов, где значения пикселей представляют собой результат уменьшения для каждого объекта в каждой полосе.


Рисунок 5. Пиксели объекта «Тепловая горячая точка», суммированные и стилизованные по средней температуре.