Metode berbasis objek

Objek gambar adalah kumpulan piksel yang terhubung dan memiliki nilai bilangan bulat yang sama. Data gambar kategoris, dikelompokkan, dan boolean cocok untuk analisis objek.

Earth Engine menawarkan metode untuk memberi label pada setiap objek dengan ID unik, menghitung jumlah piksel yang menyusun objek, dan menghitung statistik untuk nilai piksel yang memotong objek.

Hotspot termal

Bagian berikut memberikan contoh metode berbasis objek yang diterapkan ke suhu permukaan Landsat 8 dengan setiap bagian yang dibuat berdasarkan metode sebelumnya. Jalankan cuplikan berikutnya untuk membuat gambar dasar: hotspot termal (> 303 derajat Kelvin) untuk wilayah kecil di San Francisco.

Editor Kode (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');

Penyiapan Python

Lihat halaman Lingkungan Python untuk mengetahui informasi tentang Python API dan penggunaan geemap untuk pengembangan interaktif.

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

Gambar 1. Suhu untuk wilayah San Francisco. Piksel dengan suhu lebih besar dari 303 derajat Kelvin dibedakan dengan warna merah (hotspot termal).

Memberi label pada objek

Memberi label pada objek sering kali merupakan langkah pertama dalam analisis objek. Di sini, fungsi connectedComponents() digunakan untuk mengidentifikasi objek gambar dan menetapkan ID unik untuk setiap objek; semua piksel yang termasuk dalam objek diberi nilai ID bilangan bulat yang sama. Hasilnya adalah salinan gambar input dengan band "label" tambahan yang mengaitkan piksel dengan nilai ID objek berdasarkan konektivitas piksel di band pertama gambar.

Editor Kode (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');

Penyiapan Python

Lihat halaman Lingkungan Python untuk mengetahui informasi tentang Python API dan penggunaan geemap untuk pengembangan interaktif.

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

Perhatikan bahwa ukuran patch maksimum ditetapkan ke 128 piksel; objek yang terdiri dari lebih banyak piksel akan disamarkan. Konektivitas ditentukan oleh kernel ee.Kernel.plus(1), yang menentukan konektivitas empat tetangga; gunakan ee.Kernel.square(1) untuk delapan tetangga.


Gambar 2. Objek hotspot termal yang diberi label dan gaya oleh ID unik.

Ukuran objek

Jumlah piksel

Hitung jumlah piksel yang menyusun objek menggunakan metode gambar connectedPixelCount(). Mengetahui jumlah piksel dalam objek dapat membantu menyamarkan objek berdasarkan ukuran dan menghitung area objek. Cuplikan berikut menerapkan connectedPixelCount() ke band "label" gambar objectId yang ditentukan di bagian sebelumnya.

Editor Kode (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');

Penyiapan Python

Lihat halaman Lingkungan Python untuk mengetahui informasi tentang Python API dan penggunaan geemap untuk pengembangan interaktif.

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() menampilkan salinan gambar input dengan setiap piksel dari setiap band berisi jumlah tetangga yang terhubung sesuai dengan aturan konektivitas empat atau delapan tetangga yang ditentukan oleh argumen boolean yang diteruskan ke parameter eightConnected. Perhatikan bahwa konektivitas ditentukan secara independen untuk setiap band gambar input. Dalam contoh ini, gambar satu band (objectId) yang mewakili ID objek disediakan sebagai input, sehingga gambar satu band ditampilkan dengan band "label" (ada dalam gambar input), tetapi sekarang nilainya mewakili jumlah piksel yang menyusun objek; setiap piksel dari setiap objek akan memiliki nilai jumlah piksel yang sama.


Gambar 3. Objek hotspot termal diberi label dan gaya berdasarkan ukuran.

Area

Hitung area objek dengan mengalikan area satu piksel dengan jumlah piksel yang membentuk objek (ditentukan oleh connectedPixelCount()). Area piksel disediakan oleh gambar yang dihasilkan dari ee.Image.pixelArea().

Editor Kode (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');

Penyiapan Python

Lihat halaman Lingkungan Python untuk mengetahui informasi tentang Python API dan penggunaan geemap untuk pengembangan interaktif.

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

Hasilnya adalah gambar dengan setiap piksel objek yang terkait dengan area objek dalam meter persegi. Dalam contoh ini, gambar objectSize berisi satu band, jika multi-band, operasi perkalian akan diterapkan ke setiap band gambar.

Memfilter objek menurut ukuran

Ukuran objek dapat digunakan sebagai kondisi mask untuk memfokuskan analisis Anda pada objek berukuran tertentu (misalnya, menyamarkan objek yang terlalu kecil). Di sini, gambar objectArea yang dihitung pada langkah sebelumnya digunakan sebagai mask untuk menghapus objek yang luasnya kurang dari satu hektar.

Editor Kode (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');

Penyiapan Python

Lihat halaman Lingkungan Python untuk mengetahui informasi tentang Python API dan penggunaan geemap untuk pengembangan interaktif.

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

Hasilnya adalah salinan gambar objectId dengan objek kurang dari satu hektar disamarkan.

Gambar 4a. Objek hotspot termal diberi label dan gaya berdasarkan ID unik. Gambar 4b. Objek hotspot termal yang difilter menurut area minimum (1 hektar).

Statistik zona

Metode reduceConnectedComponents() menerapkan pengurangan ke piksel yang menyusun objek unik. Cuplikan berikut menggunakannya untuk menghitung suhu rata-rata objek hotspot. reduceConnectedComponents() memerlukan gambar input dengan band (atau band) yang akan dikurangi dan band yang menentukan label objek. Di sini, band gambar "label" objectID ditambahkan ke gambar suhu kelvin untuk membuat gambar input yang sesuai.

Editor Kode (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'
);

Penyiapan Python

Lihat halaman Lingkungan Python untuk mengetahui informasi tentang Python API dan penggunaan geemap untuk pengembangan interaktif.

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)

Hasilnya adalah salinan gambar input tanpa band yang digunakan untuk menentukan objek, dengan nilai piksel mewakili hasil pengurangan per objek, per band.


Gambar 5. Piksel objek hotspot termal yang diringkas dan diberi gaya berdasarkan suhu rata-rata.