Nesne tabanlı yöntemler

Resim nesneleri, aynı tam sayı değerine sahip bağlı piksel gruplarıdır. Kategorik, gruplandırılmış ve doğru/yanlış görüntü verileri nesne analizi için uygundur.

Earth Engine, her nesneyi benzersiz bir kimlikle etiketleme, nesneleri oluşturan piksellerin sayısını sayma ve nesnelerle kesişen piksellerin değerleri için istatistikler hesaplama yöntemleri sunar.

Termal sıcak noktalar

Aşağıdaki bölümlerde, Landsat 8 yüzey sıcaklığına uygulanan nesne tabanlı yöntemlere örnekler verilmiştir. Her bölüm, önceki bölümü temel alır. Temel resmi oluşturmak için aşağıdaki snippet'i çalıştırın: San Francisco'nun küçük bir bölgesi için termal sıcak noktalar (> 303 Kelvin).

Kod Düzenleyici (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 kurulumu

Python API'si ve etkileşimli geliştirme için geemap kullanımı hakkında bilgi edinmek üzere Python Ortamı sayfasına bakın.

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

Şekil 1. San Francisco'daki bir bölgenin sıcaklığı. 303 Kelvin'den yüksek sıcaklığa sahip pikseller kırmızı renkle (termal sıcak noktaları) ayırt edilir.

Nesneleri etiketleme

Nesneleri etiketleme, genellikle nesne analizinde ilk adımdır. Burada, resim nesnelerini tanımlamak ve her birine benzersiz bir kimlik atamak için connectedComponents() işlevi kullanılır. Bir nesneye ait tüm piksellere aynı tam sayı kimlik değeri atanır. Sonuç, giriş resminin bir kopyasıdır ve bu kopyada, resmin ilk bandındaki piksellerin bağlantısına göre pikselleri bir nesne kimliği değeriyle ilişkilendiren ek bir "etiketler" bandı bulunur.

Kod Düzenleyici (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 kurulumu

Python API'si ve etkileşimli geliştirme için geemap kullanımı hakkında bilgi edinmek üzere Python Ortamı sayfasına bakın.

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

Maksimum yamanın boyutunun 128 piksel olarak ayarlandığını unutmayın. Daha fazla pikselden oluşan nesneler maskelenir. Bağlantı, dört komşu bağlantısını tanımlayan bir ee.Kernel.plus(1) çekirdeği ile belirtilir. Sekiz komşu için ee.Kernel.square(1) kullanın.


Şekil 2. Benzersiz bir kimliğe göre etiketlenmiş ve stillendirilmiş termal sıcak nokta nesneleri.

Nesne boyutu

Piksel sayısı

connectedPixelCount() resim yöntemini kullanarak nesneleri oluşturan piksel sayısını hesaplayın. Bir nesnenin piksel sayısını bilmek, nesneleri boyuta göre maskelemek ve nesne alanını hesaplamak için yararlı olabilir. Aşağıdaki snippet, connectedPixelCount() önceki bölümde tanımlanan objectId resminin "etiketler" bandına uygulanır.

Kod Düzenleyici (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 kurulumu

Python API'si ve etkileşimli geliştirme için geemap kullanımı hakkında bilgi edinmek üzere Python Ortamı sayfasına bakın.

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(), her bandın her pikselinde eightConnected parametresine iletilen bir boole bağımsız değişkeni tarafından belirlenen dört veya sekiz komşu bağlantı kuralına göre bağlı komşu sayısının bulunduğu giriş görüntüsünün bir kopyasını döndürür. Bağlantılılığın, giriş görüntüsünün her bandı için ayrı ayrı belirlendiğini unutmayın. Bu örnekte, giriş olarak nesne kimliğini temsil eden tek bantlı bir görüntü (objectId) sağlanmıştır. Bu nedenle, "etiketler" bandı (giriş görüntüsünde bu şekilde mevcuttur) içeren tek bantlı bir görüntü döndürülmüştür. Ancak artık değerler, nesneleri oluşturan piksel sayısını temsil etmektedir. Her nesnenin her pikseli aynı piksel sayısı değerine sahip olacaktır.


Şekil 3. Boyuta göre etiketlenmiş ve stillendirilmiş termal sıcak nokta nesneleri.

Bölge

Tek bir pikselin alanını, nesneyi oluşturan piksel sayısıyla (connectedPixelCount() tarafından belirlenir) çarparak nesne alanını hesaplayın. Piksel alanı, ee.Image.pixelArea()'ten oluşturulan bir resim tarafından sağlanır.

Kod Düzenleyici (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 kurulumu

Python API'si ve etkileşimli geliştirme için geemap kullanımı hakkında bilgi edinmek üzere Python Ortamı sayfasına bakın.

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

Sonuç olarak, bir nesnenin her pikseli, nesnenin metrekare cinsinden alanını gösteren bir resim elde edilir. Bu örnekte objectSize resmi tek bantlıdır. Çok bantlı olsaydı çarpma işlemi resmin her bandına uygulanırdı.

Nesneleri boyuta göre filtreleme

Nesne boyutu, analizinizi belirli boyuttaki nesnelere odaklamak için maske koşulu olarak kullanılabilir (ör. çok küçük nesneleri maskeleme). Burada, önceki adımda hesaplanan objectArea görüntüsü, alanı bir hektardan az olan nesneleri kaldırmak için maske olarak kullanılır.

Kod Düzenleyici (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 kurulumu

Python API'si ve etkileşimli geliştirme için geemap kullanımı hakkında bilgi edinmek üzere Python Ortamı sayfasına bakın.

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

Sonuç, bir hektardan küçük nesnelerin maskelendiği objectId resminin bir kopyasıdır.

Şekil 4a. Benzersiz kimliğe göre etiketlenmiş ve stillendirilmiş termal sıcak nokta nesneleri. Şekil 4b. Minimum alana (1 hektar) göre filtrelenen termal sıcak nokta nesneleri.

Bölgesel istatistikler

reduceConnectedComponents() yöntemi, benzersiz nesneleri oluşturan piksellere bir azaltıcı uygular. Aşağıdaki snippet, sıcak nokta nesnelerinin ortalama sıcaklığını hesaplamak için bu işlevi kullanır. reduceConnectedComponents(), azaltılacak bir bant (veya bantlar) ve nesne etiketlerini tanımlayan bir bant içeren bir giriş resmi gerektirir. Burada, uygun bir giriş resmi oluşturmak için objectID "etiketler" resim bandı kelvin sıcaklık resmine eklenmiştir.

Kod Düzenleyici (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 kurulumu

Python API'si ve etkileşimli geliştirme için geemap kullanımı hakkında bilgi edinmek üzere Python Ortamı sayfasına bakın.

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)

Sonuç, nesneleri tanımlamak için kullanılan bant içermeyen giriş görüntüsünün bir kopyasıdır. Bu kopyada piksel değerleri, bant başına nesne başına azaltma sonucunu temsil eder.


Şekil 5. Ortalama sıcaklığa göre özetlenen ve biçimlendirilen termal sıcak nokta nesnesi pikselleri.