שיטות מבוססות-אובייקט

אובייקטים של תמונות הם קבוצות של פיקסלים מחוברים שיש להם אותו ערך שלם. נתוני תמונות קטגוריאליים, ממוינים וערכים בוליאניים מתאימים לניתוח אובייקטים.

ב-Earth Engine יש שיטות לתיוג כל אובייקט במזהה ייחודי, לספירת מספר הפיקסלים שמרכיבים את האובייקטים ולחישוב נתונים סטטיסטיים של ערכי פיקסלים שחופפים לאובייקטים.

נקודות חמות תרמיות

בקטעים הבאים מפורטות דוגמאות לשיטות מבוססות-אובייקט שחלות על טמפרטורת פני השטח של Landsat 8, כאשר כל קטע מבוסס על הקטע הקודם. מריצים את קטע הקוד הבא כדי ליצור את קובץ האימג' הבסיסי: נקודות חמות תרמו-תרמוגרפיות (מעל 303 מעלות קלווין) באזור קטן בסן פרנסיסקו.

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

בדף סביבת Python מפורט מידע על Python API ועל השימוש ב-geemap לפיתוח אינטראקטיבי.

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

איור 1. הטמפרטורה באזור מסוים בסן פרנסיסקו. פיקסלים עם טמפרטורה של יותר מ-303 מעלות קלווין מסומנים בצבע אדום (נקודות חמות תרמוניות).

תיוג אובייקטים

תיוג אובייקטים הוא לרוב השלב הראשון בניתוח אובייקטים. כאן, הפונקציה connectedComponents() משמשת לזיהוי אובייקטים בתמונה ולהקצאת מזהה ייחודי לכל אחד מהם. לכל הפיקסלים ששייכים לאובייקט מוקצה אותו ערך מזהה שלם. התוצאה היא עותק של תמונת הקלט עם פס נוסף של תוויות שמשויך פיקסלים לערך של מזהה אובייקט על סמך קישוריות של פיקסלים בפס הראשון של התמונה.

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

בדף סביבת Python מפורט מידע על Python API ועל השימוש ב-geemap לפיתוח אינטראקטיבי.

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

שימו לב שגודל התיקון המקסימלי מוגדר ל-128 פיקסלים. אובייקטים שמכילים יותר פיקסלים ממוסתרים. הקישוריות מצוינה על ידי ליבה מסוג ee.Kernel.plus(1), שמגדירה קישוריות של ארבעה שכנים. צריך להשתמש ב-ee.Kernel.square(1) כדי לקבל קישוריות של שמונה שכנים.


איור 2. אובייקטים של נקודות חמות תרמוניות עם תוויות וסגנון לפי מזהה ייחודי.

גודל האובייקט

מספר הפיקסלים

חישוב מספר הפיקסלים שמרכיבים את העצמים באמצעות שיטת התמונה connectedPixelCount(). חשוב לדעת כמה פיקסלים יש באובייקט כדי שתוכלו להסתיר אובייקטים לפי גודל ולחשב את שטח האובייקט. קטע הקוד הבא מחיל את connectedPixelCount() על הפס 'תוויות' של התמונה objectId שהוגדרה בקטע הקודם.

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

בדף סביבת Python מפורט מידע על Python API ועל השימוש ב-geemap לפיתוח אינטראקטיבי.

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() מחזירה עותק של קובץ הקלט, שבו כל פיקסל בכל פס מכיל את מספר השכנים המקושרים בהתאם לכלל הקישוריות של ארבעה או שמונה שכנים, שנקבעת על ידי ארגומנט בוליאני שמוענק לפרמטר eightConnected. שימו לב שהקישוריות נקבעת בנפרד לכל פס של תמונה הקלט. בדוגמה הזו, תמונה עם פס אחד (objectId) שמייצגת את מזהה האובייקט סופקה כקלט, ולכן הוחזרה תמונה עם פס אחד עם פס 'תוויות' (שנמצא כזה בתמונה הקלט), אבל עכשיו הערכים מייצגים את מספר הפיקסלים שמרכיבים את האובייקטים. לכל פיקסל בכל אובייקט יהיה אותו ערך של מספר הפיקסלים.


איור 3. אובייקטים של נקודות חמות תרמוניות עם תוויות וסגנון לפי גודל.

אזור

כדי לחשב את שטח האובייקט, מכפילים את השטח של פיקסל אחד במספר הפיקסלים שמרכיבים את האובייקט (נקבע על ידי connectedPixelCount()). שטח הפיקסל מסופק על ידי תמונה שנוצרה מ-ee.Image.pixelArea().

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

בדף סביבת Python מפורט מידע על Python API ועל השימוש ב-geemap לפיתוח אינטראקטיבי.

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

התוצאה היא תמונה שבה כל פיקסל של אובייקט מייצג את שטח האובייקט במטרים רבועים. בדוגמה הזו, קובץ האימג' objectSize מכיל רק רצועה אחת. אם הוא היה מכיל כמה רצועות, פעולת המכפלה הייתה חלה על כל רצועה של התמונה.

סינון אובייקטים לפי גודל

אפשר להשתמש בגודל האובייקט כתנאי למסכה כדי למקד את הניתוח באובייקטים בגודל מסוים (למשל, להסתיר אובייקטים קטנים מדי). כאן, התמונה objectArea שחושב בשלב הקודם משמשת כמסכה להסרת אובייקטים ששטחם קטן מ-10 דונם.

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

בדף סביבת Python מפורט מידע על Python API ועל השימוש ב-geemap לפיתוח אינטראקטיבי.

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

התוצאה היא עותק של התמונה objectId שבו אובייקטים בשטח של פחות מ-10 דונם ממוחקים.

איור 4a. אובייקטים של נקודות חמות תרמוגרפיות עם תוויות וסגנון לפי מזהה ייחודי. איור 4ב. אובייקטים של נקודות חמות תרמוניות מסוננים לפי שטח מינימלי (1 דונם).

נתונים סטטיסטיים של תחום מוגדר

השיטה reduceConnectedComponents() מחילה פונקציית הפחתה על הפיקסלים שמרכיבים אובייקטים ייחודיים. קטע הקוד הבא משתמש בו כדי לחשב את הטמפרטורה הממוצעת של אובייקטים של נקודות חמות. הפונקציה reduceConnectedComponents() דורשת תמונה של קלט עם פס (או פסים) שרוצים לצמצם ופס שמגדיר תוויות של אובייקטים. כאן, הפס של התמונה objectID 'תוויות' מתווסף לתמונת הטמפרטורה kelvin כדי ליצור תמונת קלט מתאימה.

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

בדף סביבת Python מפורט מידע על Python API ועל השימוש ב-geemap לפיתוח אינטראקטיבי.

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)

התוצאה היא עותק של תמונת הקלט ללא התדר שמשמש להגדרת אובייקטים, כאשר ערכי הפיקסלים מייצגים את תוצאת ההקטנה לכל אובייקט, לכל תדר.


איור 5. סיכום של פיקסלים של עצם של נקודה חמה תרמית, עם עיצוב לפי הטמפרטורה הממוצעת.