Objektbasierte Methoden

Bildobjekte sind Gruppen verbundener Pixel mit demselben Ganzzahlwert. Kategorische, gebatchte und boolesche Bilddaten eignen sich für die Objektanalyse.

Earth Engine bietet Methoden, um jedes Objekt mit einer eindeutigen ID zu versehen, die Anzahl der Pixel zu zählen, aus denen Objekte bestehen, und Statistiken für Pixelwerte zu berechnen, die sich mit Objekten überschneiden.

Thermische Hotspots

In den folgenden Abschnitten finden Sie Beispiele für objektbasierte Methoden, die auf die Oberflächentemperatur von Landsat 8 angewendet werden. Dabei baut jeder Abschnitt auf dem vorherigen auf. Führen Sie das nächste Snippet aus, um das Basisbild zu generieren: Wärmehotspots (über 303 Kelvin) für eine kleine Region in San Francisco.

Code-Editor (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 einrichten

Auf der Seite Python-Umgebung finden Sie Informationen zur Python API und zur Verwendung von geemap für die interaktive Entwicklung.

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

Abbildung 1. Temperatur für eine Region in San Francisco. Pixel mit einer Temperatur von über 303 Kelvin sind rot hervorgehoben (thermische Hotspots).

Labelobjekte

Das Beschriften von Objekten ist oft der erste Schritt bei der Objektanalyse. Hier wird die Funktion connectedComponents() verwendet, um Bildobjekte zu identifizieren und ihnen jeweils eine eindeutige ID zuzuweisen. Allen Pixeln, die zu einem Objekt gehören, wird derselbe ganzzahlige ID-Wert zugewiesen. Das Ergebnis ist eine Kopie des Eingabebilds mit einem zusätzlichen Band „Labels“, in dem Pixel basierend auf der Konnektivität von Pixeln im ersten Band des Bilds mit einem Objekt-ID-Wert verknüpft werden.

Code-Editor (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 einrichten

Auf der Seite Python-Umgebung finden Sie Informationen zur Python API und zur Verwendung von geemap für die interaktive Entwicklung.

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

Die maximale Patchgröße ist auf 128 Pixel festgelegt. Objekte, die aus mehr Pixeln bestehen, werden ausgeblendet. Die Konnektivität wird durch einen ee.Kernel.plus(1)-Kern angegeben, der eine Konnektivität mit vier Nachbarn definiert. Verwenden Sie ee.Kernel.square(1) für eine Konnektivität mit acht Nachbarn.


Abbildung 2. Thermische Hotspot-Objekte, die mit einer eindeutigen ID gekennzeichnet und formatiert sind.

Objektgröße

Anzahl der Pixel

Berechnen Sie mit der Bildmethode connectedPixelCount() die Anzahl der Pixel, aus denen Objekte bestehen. Die Anzahl der Pixel in einem Objekt kann hilfreich sein, um Objekte nach Größe zu maskieren und den Objektbereich zu berechnen. Im folgenden Snippet wird connectedPixelCount() auf den Band „labels“ des im vorherigen Abschnitt definierten objectId-Bilds angewendet.

Code-Editor (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 einrichten

Auf der Seite Python-Umgebung finden Sie Informationen zur Python API und zur Verwendung von geemap für die interaktive Entwicklung.

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

connectedPixelCount() gibt eine Kopie des Eingabebilds zurück, in der jedes Pixel jedes Bandes die Anzahl der verbundenen Nachbarn gemäß der Regel für vier oder acht Nachbarn enthält, die durch ein boolesches Argument bestimmt wird, das an den Parameter eightConnected übergeben wird. Die Konnektivität wird für jeden Band des Eingabebilds unabhängig bestimmt. In diesem Beispiel wurde ein einbandiges Bild (objectId) als Objekt-ID angegeben. Daher wurde ein einbandiges Bild mit einem Labels-Band zurückgegeben, das im Eingabebild vorhanden war. Die Werte repräsentieren jetzt die Anzahl der Pixel, aus denen Objekte bestehen. Jedes Pixel jedes Objekts hat denselben Pixelanzahlwert.


Abbildung 3. Thermische Hotspot-Objekte, die nach Größe beschriftet und formatiert sind.

Gebiet

Berechnen Sie die Objektfläche, indem Sie die Fläche eines einzelnen Pixels mit der Anzahl der Pixel multiplizieren, aus denen ein Objekt besteht (wird von connectedPixelCount() bestimmt). Die Pixelfläche wird von einem Bild bereitgestellt, das aus ee.Image.pixelArea() generiert wurde.

Code-Editor (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 einrichten

Auf der Seite Python-Umgebung finden Sie Informationen zur Python API und zur Verwendung von geemap für die interaktive Entwicklung.

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

Das Ergebnis ist ein Bild, in dem jedes Pixel eines Objekts den Flächeninhalt des Objekts in Quadratmetern darstellt. In diesem Beispiel enthält das objectSize-Bild einen einzelnen Band. Bei einem mehrbändigen Bild würde die Multiplikation auf jeden Band des Bildes angewendet.

Objekte nach Größe filtern

Die Objektgröße kann als Maskenbedingung verwendet werden, um die Analyse auf Objekte einer bestimmten Größe zu konzentrieren (z.B. Objekte ausblenden, die zu klein sind). Hier wird das im vorherigen Schritt berechnete objectArea-Bild als Maske verwendet, um Objekte zu entfernen, deren Fläche weniger als ein Hektar beträgt.

Code-Editor (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 einrichten

Auf der Seite Python-Umgebung finden Sie Informationen zur Python API und zur Verwendung von geemap für die interaktive Entwicklung.

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

Das Ergebnis ist eine Kopie des objectId-Bilds, bei der Objekte mit einer Fläche von weniger als einem Hektar ausgeblendet sind.

Abbildung 4a. Thermische Hotspot-Objekte, die anhand der eindeutigen ID gekennzeichnet und formatiert sind. Abbildung 4b. Thermische Hotspot-Objekte, gefiltert nach Mindestfläche (1 Hektar).

Zonale Statistiken

Die Methode reduceConnectedComponents() wendet einen Reduzierer auf die Pixel an, aus denen einzelne Objekte bestehen. Im folgenden Snippet wird damit die durchschnittliche Temperatur von Hotspot-Objekten berechnet. Für reduceConnectedComponents() ist ein Eingabebild mit einem oder mehreren zu reduzierenden Bändern und einem Band erforderlich, das Objektlabels definiert. Hier wird dem Temperaturbild kelvin das Bildband objectID „Labels“ hinzugefügt, um ein geeignetes Eingabebild zu erstellen.

Code-Editor (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 einrichten

Auf der Seite Python-Umgebung finden Sie Informationen zur Python API und zur Verwendung von geemap für die interaktive Entwicklung.

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)

Das Ergebnis ist eine Kopie des Eingabebilds ohne den zum Definieren von Objekten verwendeten Band. Die Pixelwerte stellen das Ergebnis der Reduzierung pro Objekt und Band dar.


Abbildung 5. Pixel von Objekten mit Wärmehotspots, zusammengefasst und nach durchschnittlicher Temperatur gestaltet.