Metody oparte na obiektach

Obiekty obrazu to zbiory połączonych pikseli o tej samej wartości całkowitej. Do analizy obiektów nadają się dane obrazowe typu łańcuchowego, binarnego i boolowskiego.

Earth Engine oferuje metody etykietowania każdego obiektu za pomocą unikalnego identyfikatora, zliczania pikseli tworzących obiekty oraz obliczania statystyk dla wartości pikseli, które przecinają obiekty.

Punkty nagrzewania

W następnych sekcjach znajdziesz przykłady metod opartych na obiektach zastosowanych do temperatury powierzchni z Landsata 8. Każda sekcja opiera się na poprzedniej. Uruchom następny fragment kodu, aby wygenerować obraz podstawowy: punkty gorące termiczne (> 303 stopnie Kelwina) dla niewielkiego obszaru San Francisco.

Edytor kodu (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');

Konfiguracja Pythona

Informacje o interfejsie Python API i o używaniu pakietu geemap do programowania interaktywnego znajdziesz na stronie Python Environment.

import ee
import geemap.core as geemap

Colab (Python)

# 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')

Rysunek 1. Temperatura w regionie San Francisco. Piksel o temperaturze większej niż 303 stopnie Kelwina jest wyróżniony na czerwono (punkty o wysokiej temperaturze).

Oznaczanie obiektów

Oznaczanie obiektów jest często pierwszym krokiem w analizie obiektów. W tym przypadku funkcja connectedComponents() służy do identyfikowania obiektów obrazu i przypisywania im unikalnych identyfikatorów. Wszystkim pikselom należącym do obiektu przypisana jest ta sama wartość identyfikatora całkowitego. W efekcie otrzymujemy kopię obrazu wejściowego z dodatkowym pasmem „labeli”, które łączy piksele z wartością identyfikatora obiektu na podstawie połączeń pikseli w pierwszym paśmie obrazu.

Edytor kodu (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');

Konfiguracja Pythona

Informacje o interfejsie Python API i o używaniu pakietu geemap do programowania interaktywnego znajdziesz na stronie Python Environment.

import ee
import geemap.core as geemap

Colab (Python)

# 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')

Pamiętaj, że maksymalny rozmiar poprawki to 128 pikseli. Obiekty złożone z większej liczby pikseli są maskowane. Łączność jest określana przez jądro ee.Kernel.plus(1), które definiuje 4-sąsiedztwo. Aby uzyskać 8-sąsiedztwo, użyj jądra ee.Kernel.square(1).


Rysunek 2. Obiekty punktów gorących z ciepłem oznaczone i sformatowane za pomocą unikalnego identyfikatora.

Rozmiar obiektu

Liczba pikseli

Oblicz liczbę pikseli tworzących obiekty za pomocą metody connectedPixelCount(). Znajomość liczby pikseli w obiekcie może być przydatna do maskowania obiektów według rozmiaru i obliczania ich powierzchni. Podany niżej fragment kodu stosuje connectedPixelCount()do paska „labels” obrazu objectId zdefiniowanego w poprzedniej sekcji.

Edytor kodu (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');

Konfiguracja Pythona

Informacje o interfejsie Python API i o używaniu pakietu geemap do programowania interaktywnego znajdziesz na stronie Python Environment.

import ee
import geemap.core as geemap

Colab (Python)

# 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')

Funkcja connectedPixelCount() zwraca kopię obrazu wejściowego, w której każdy piksel każdego pasma zawiera liczbę sąsiadów połączonych zgodnie z regułą łączności sąsiedniej 4- lub 8-kątnej, określoną przez argument logiczny przekazany do parametru eightConnected. Pamiętaj, że łączność jest określana niezależnie dla każdego pasma obrazu wejściowego. W tym przykładzie jako dane wejściowe podano obraz jednopasmowy (objectId) reprezentujący identyfikator obiektu. W związku z tym zwrócono obraz jednopasmowy z pasmem „labels” (obecnym w danym obrazie wejściowym), ale teraz wartości reprezentują liczbę pikseli tworzących obiekty. Każdy piksel każdego obiektu ma tę samą wartość liczby pikseli.


Ilustracja 3. Obiekty obszaru interaktywnego w ciepłach o różnych stylach i rozmiarach.

Obszar

Obliczanie pola obiektu polega na pomnożeniu pola pojedynczego piksela przez liczbę pikseli tworzących obiekt (określaną przez connectedPixelCount()). Pole piksela jest podawane przez obraz wygenerowany z ee.Image.pixelArea().

Edytor kodu (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');

Konfiguracja Pythona

Informacje o interfejsie Python API i o używaniu pakietu geemap do programowania interaktywnego znajdziesz na stronie Python Environment.

import ee
import geemap.core as geemap

Colab (Python)

# 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',
)

W efekcie otrzymujemy obraz, na którym każdy piksel obiektu odpowiada jego powierzchni w metrach kwadratowych. W tym przykładzie obraz objectSize zawiera jeden pasmo. Gdyby było ono wielopasmowe, operacja mnożenia zostałaby zastosowana do każdego pasma obrazu.

Filtrowanie obiektów według rozmiaru

Rozmiar obiektu może służyć jako warunek maski, aby skoncentrować analizę na obiektach o określonym rozmiarze (np. maskowanie obiektów, które są zbyt małe). Tutaj obraz objectArea obliczony w poprzednim kroku jest używany jako maska do usuwania obiektów o powierzchni mniejszej niż 1 ha.

Edytor kodu (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');

Konfiguracja Pythona

Informacje o interfejsie Python API i o używaniu pakietu geemap do programowania interaktywnego znajdziesz na stronie Python Environment.

import ee
import geemap.core as geemap

Colab (Python)

# 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')

W efekcie powstaje kopia obrazu objectId, w której obiekty o powierzchni mniejszej niż 1 ha są zamaskowane.

Rysunek 4a. Obiekty obszarów termicznych o unikalnych identyfikatorach z oznaczeniem i stylizacją. Rysunek 4b. Obiekty punktów gorących termicznie, posortowane według minimalnej powierzchni (1 hektar).

Statystyki strefowe

Metoda reduceConnectedComponents() stosuje reduktor do pikseli tworzących niepowtarzalne obiekty. W tym fragmencie kodu jest on używany do obliczania średniej temperatury obiektów punktów krytycznych. reduceConnectedComponents() wymaga podania wejścia w postaci obrazu z pasmem (lub pasmami) do zmniejszenia oraz pasma, które definiuje etykiety obiektów. Tutaj pasek obrazu „labele” (objectID) jest dodawany do obrazu temperatury (kelvin), aby utworzyć odpowiedni obraz wejściowy.

Edytor kodu (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'
);

Konfiguracja Pythona

Informacje o interfejsie Python API i o używaniu pakietu geemap do programowania interaktywnego znajdziesz na stronie Python Environment.

import ee
import geemap.core as geemap

Colab (Python)

# 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)

W efekcie otrzymujemy kopię obrazu wejściowego bez pasma używanego do definiowania obiektów, gdzie wartości pikseli reprezentują wynik redukcji na obiekt i na pasmo.


Rysunek 5. Pixele obiektu hotspotu termicznego podsumowane i stylizowane według średniej temperatury.