عملیات ریاضی,عملیات ریاضی

ریاضیات تصویر را می توان با استفاده از عملگرهایی مانند add() و subtract() انجام داد، اما برای محاسبات پیچیده با بیش از چند عبارت، expression() جایگزین خوبی است. برای اطلاعات بیشتر در مورد عملگرها و عبارات به بخش های زیر مراجعه کنید.

اپراتورها

عملگرهای ریاضی عملیات محاسباتی پایه را روی باندهای تصویر انجام می دهند. آنها دو ورودی می گیرند: یا دو تصویر یا یک تصویر و یک عبارت ثابت، که به عنوان یک تصویر ثابت تک باند بدون پیکسل های ماسک تفسیر می شود. عملیات در هر پیکسل برای هر باند انجام می شود.

به عنوان یک مثال اساسی، کار محاسبه شاخص گیاهی تفاوت نرمال شده (NDVI) را با استفاده از تصاویر VIIRS در نظر بگیرید، که در آن از عملگرهای add() ، subtract() و divide() استفاده می شود:

ویرایشگر کد (جاوا اسکریپت)

// Load a VIIRS 8-day surface reflectance composite for May 2024.
var viirs202405 = ee.ImageCollection('NASA/VIIRS/002/VNP09H1').filter(
  ee.Filter.date('2024-05-01', '2024-05-16')).first();

// Compute NDVI.
var ndvi202405 = viirs202405.select('SurfReflect_I2')
  .subtract(viirs202405.select('SurfReflect_I1'))
  .divide(viirs202405.select('SurfReflect_I2')
    .add(viirs202405.select('SurfReflect_I1')));

راه اندازی پایتون

برای اطلاعات در مورد API پایتون و استفاده از geemap برای توسعه تعاملی به صفحه محیط پایتون مراجعه کنید.

import ee
import geemap.core as geemap

کولب (پایتون)

# Load a VIIRS 8-day surface reflectance composite for May 2024.
viirs202405 = (
    ee.ImageCollection('NASA/VIIRS/002/VNP09H1')
    .filter(ee.Filter.date('2024-05-01', '2024-05-16'))
    .first()
)

# Compute NDVI.
ndvi202405 = (
    viirs202405.select('SurfReflect_I2')
    .subtract(viirs202405.select('SurfReflect_I1'))
    .divide(
        viirs202405.select('SurfReflect_I2').add(
            viirs202405.select('SurfReflect_I1')
        )
    )
)

فقط تقاطع پیکسل های بدون ماسک بین دو ورودی در نظر گرفته شده و به عنوان بدون ماسک برگردانده می شود، بقیه موارد ماسک می شوند. به طور کلی، اگر هر یک از ورودی ها فقط یک باند داشته باشد، در مقابل همه باندهای ورودی دیگر استفاده می شود. اگر ورودی‌ها تعداد باندهای یکسانی داشته باشند، اما نام‌های مشابهی نداشته باشند، به ترتیب طبیعی به‌صورت جفتی استفاده می‌شوند. باندهای خروجی برای بلندتر از دو ورودی، یا اگر طول آنها مساوی باشد، به ترتیب ورودی اول نامگذاری می شوند. نوع پیکسل های خروجی، اتحاد انواع ورودی است.

مثال زیر از تفریق تصویر چند باند نشان می دهد که چگونه باندها به طور خودکار مطابقت می یابند و در نتیجه یک "بردار تغییر" برای هر پیکسل برای هر باند همزمان ایجاد می شود.

ویرایشگر کد (جاوا اسکریپت)

// Load a VIIRS 8-day surface reflectance composite for September 2024.
var viirs202409 = ee.ImageCollection('NASA/VIIRS/002/VNP09H1').filter(
  ee.Filter.date('2024-09-01', '2024-09-16')).first();

// Compute multi-band difference between the September composite and the
// previously loaded May composite.
var diff = viirs202409.subtract(ndvi202405);
Map.addLayer(diff, {
  bands: ['SurfReflect_I1', 'SurfReflect_I2', 'SurfReflect_I3'],
  min: -1,
  max: 1
}, 'difference');

// Compute the squared difference in each band.
var squaredDifference = diff.pow(2);
Map.addLayer(squaredDifference, {
  bands: ['SurfReflect_I1', 'SurfReflect_I2', 'SurfReflect_I3'],
  min: 0,
  max: 0.7
}, 'squared diff.');

راه اندازی پایتون

برای اطلاعات در مورد API پایتون و استفاده از geemap برای توسعه تعاملی به صفحه محیط پایتون مراجعه کنید.

import ee
import geemap.core as geemap

کولب (پایتون)

# Load a VIIRS 8-day surface reflectance composite for September 2024.
viirs202409 = (
    ee.ImageCollection('NASA/VIIRS/002/VNP09H1')
    .filter(ee.Filter.date('2024-09-01', '2024-09-16'))
    .first()
)

# Compute multi-band difference between the September composite and the
# previously loaded May composite.
diff = viirs202409.subtract(ndvi202405)

m = geemap.Map()
m.add_layer(
    diff,
    {
        'bands': ['SurfReflect_I1', 'SurfReflect_I2', 'SurfReflect_I3'],
        'min': -1,
        'max': 1,
    },
    'difference',
)

# Compute the squared difference in each band.
squared_difference = diff.pow(2)

m.add_layer(
    squared_difference,
    {
        'bands': ['SurfReflect_I1', 'SurfReflect_I2', 'SurfReflect_I3'],
        'min': 0,
        'max': 0.7,
    },
    'squared diff.',
)
display(m)

در قسمت دوم این مثال، اختلاف مجذور با استفاده از image.pow(2) محاسبه می‌شود. برای فهرست کامل عملگرهای ریاضی که محاسبات پایه، مثلثات، توان، گرد کردن، ریخته‌گری، عملیات بیتی و موارد دیگر را مدیریت می‌کنند، به مستندات API مراجعه کنید.

عبارات

برای پیاده‌سازی عبارات پیچیده‌تر ریاضی، استفاده از image.expression() را در نظر بگیرید که نمایش متنی یک عملیات ریاضی را تجزیه می‌کند. مثال زیر از expression() برای محاسبه شاخص گیاهی پیشرفته (EVI) استفاده می کند:

ویرایشگر کد (جاوا اسکریپت)

// Load a Landsat 8 image.
var image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318');

// Compute the EVI using an expression.
var evi = image.expression(
    '2.5 * ((NIR - RED) / (NIR + 6 * RED - 7.5 * BLUE + 1))', {
      'NIR': image.select('B5'),
      'RED': image.select('B4'),
      'BLUE': image.select('B2')
});

Map.centerObject(image, 9);
Map.addLayer(evi, {min: -1, max: 1, palette: ['a6611a', 'f5f5f5', '4dac26']});

راه اندازی پایتون

برای اطلاعات در مورد API پایتون و استفاده از geemap برای توسعه تعاملی به صفحه محیط پایتون مراجعه کنید.

import ee
import geemap.core as geemap

کولب (پایتون)

# Load a Landsat 8 image.
image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318')

# Compute the EVI using an expression.
evi = image.expression(
    '2.5 * ((NIR - RED) / (NIR + 6 * RED - 7.5 * BLUE + 1))',
    {
        'NIR': image.select('B5'),
        'RED': image.select('B4'),
        'BLUE': image.select('B2'),
    },
)

# Define a map centered on San Francisco Bay.
map_evi = geemap.Map(center=[37.4675, -122.1363], zoom=9)

# Add the image layer to the map and display it.
map_evi.add_layer(
    evi, {'min': -1, 'max': 1, 'palette': ['a6611a', 'f5f5f5', '4dac26']}, 'evi'
)
display(map_evi)

توجه داشته باشید که اولین آرگومان برای expression() نمایش متنی عملیات ریاضی است، آرگومان دوم یک فرهنگ لغت است که در آن کلیدها نام متغیرهای مورد استفاده در عبارت هستند و مقادیر نوارهای تصویری هستند که متغیرها باید به آنها نگاشت شوند. باندهای موجود در تصویر ممکن است به‌جای ارائه فرهنگ لغت به‌عنوان b("band name") یا b(index) نامیده شوند، برای مثال b(0) . هنگام استفاده از فرهنگ لغت نقشه نوار، باندها را می توان از تصاویری غیر از ورودی تعریف کرد. توجه داشته باشید که expression() از «تقسیم طبقه» استفاده می‌کند که باقیمانده را کنار می‌گذارد و وقتی دو عدد صحیح تقسیم می‌شوند یک عدد صحیح برمی‌گرداند. به عنوان مثال 10 / 20 = 0 . برای تغییر این رفتار، یکی از عملوندها را در 1.0 ضرب کنید: 10 * 1.0 / 20 = 0.5 . تنها تقاطع پیکسل‌های بدون ماسک در نظر گرفته می‌شود و زمانی که باندهای بیش از یک تصویر منبع ارزیابی می‌شوند، به‌عنوان بدون نقاب برگردانده می‌شوند. عملگرهای عبارت پشتیبانی شده در جدول زیر فهرست شده اند.

عملگرهای expression()
تایپ کنید نماد نام
حسابی + - * / % ** جمع، تفریق، ضرب، تقسیم، مدول، توان
رابطه ای == != < > <= >= مساوی، نه مساوی، کمتر از، بزرگتر از و غیره.
منطقی && || ! ^ و، یا، نه، Xor
سه تایی ? : اگر پس دیگر
،

ریاضیات تصویر را می توان با استفاده از عملگرهایی مانند add() و subtract() انجام داد، اما برای محاسبات پیچیده با بیش از چند عبارت، expression() جایگزین خوبی است. برای اطلاعات بیشتر در مورد عملگرها و عبارات به بخش های زیر مراجعه کنید.

اپراتورها

عملگرهای ریاضی عملیات محاسباتی پایه را روی باندهای تصویر انجام می دهند. آنها دو ورودی می گیرند: یا دو تصویر یا یک تصویر و یک عبارت ثابت، که به عنوان یک تصویر ثابت تک باند بدون پیکسل های ماسک تفسیر می شود. عملیات در هر پیکسل برای هر باند انجام می شود.

به عنوان یک مثال اساسی، کار محاسبه شاخص گیاهی تفاوت نرمال شده (NDVI) را با استفاده از تصاویر VIIRS در نظر بگیرید، که در آن از عملگرهای add() ، subtract() و divide() استفاده می شود:

ویرایشگر کد (جاوا اسکریپت)

// Load a VIIRS 8-day surface reflectance composite for May 2024.
var viirs202405 = ee.ImageCollection('NASA/VIIRS/002/VNP09H1').filter(
  ee.Filter.date('2024-05-01', '2024-05-16')).first();

// Compute NDVI.
var ndvi202405 = viirs202405.select('SurfReflect_I2')
  .subtract(viirs202405.select('SurfReflect_I1'))
  .divide(viirs202405.select('SurfReflect_I2')
    .add(viirs202405.select('SurfReflect_I1')));

راه اندازی پایتون

برای اطلاعات در مورد API پایتون و استفاده از geemap برای توسعه تعاملی به صفحه محیط پایتون مراجعه کنید.

import ee
import geemap.core as geemap

کولب (پایتون)

# Load a VIIRS 8-day surface reflectance composite for May 2024.
viirs202405 = (
    ee.ImageCollection('NASA/VIIRS/002/VNP09H1')
    .filter(ee.Filter.date('2024-05-01', '2024-05-16'))
    .first()
)

# Compute NDVI.
ndvi202405 = (
    viirs202405.select('SurfReflect_I2')
    .subtract(viirs202405.select('SurfReflect_I1'))
    .divide(
        viirs202405.select('SurfReflect_I2').add(
            viirs202405.select('SurfReflect_I1')
        )
    )
)

فقط تقاطع پیکسل های بدون ماسک بین دو ورودی در نظر گرفته شده و به عنوان بدون ماسک برگردانده می شود، بقیه موارد ماسک می شوند. به طور کلی، اگر هر یک از ورودی ها فقط یک باند داشته باشد، در مقابل همه باندهای ورودی دیگر استفاده می شود. اگر ورودی‌ها تعداد باندهای یکسانی داشته باشند، اما نام‌های مشابهی نداشته باشند، به ترتیب طبیعی به‌صورت جفتی استفاده می‌شوند. باندهای خروجی برای بلندتر از دو ورودی، یا اگر طول آنها مساوی باشد، به ترتیب ورودی اول نامگذاری می شوند. نوع پیکسل های خروجی، اتحاد انواع ورودی است.

مثال زیر از تفریق تصویر چند باند نشان می دهد که چگونه باندها به طور خودکار مطابقت می یابند و در نتیجه یک "بردار تغییر" برای هر پیکسل برای هر باند همزمان ایجاد می شود.

ویرایشگر کد (جاوا اسکریپت)

// Load a VIIRS 8-day surface reflectance composite for September 2024.
var viirs202409 = ee.ImageCollection('NASA/VIIRS/002/VNP09H1').filter(
  ee.Filter.date('2024-09-01', '2024-09-16')).first();

// Compute multi-band difference between the September composite and the
// previously loaded May composite.
var diff = viirs202409.subtract(ndvi202405);
Map.addLayer(diff, {
  bands: ['SurfReflect_I1', 'SurfReflect_I2', 'SurfReflect_I3'],
  min: -1,
  max: 1
}, 'difference');

// Compute the squared difference in each band.
var squaredDifference = diff.pow(2);
Map.addLayer(squaredDifference, {
  bands: ['SurfReflect_I1', 'SurfReflect_I2', 'SurfReflect_I3'],
  min: 0,
  max: 0.7
}, 'squared diff.');

راه اندازی پایتون

برای اطلاعات در مورد API پایتون و استفاده از geemap برای توسعه تعاملی به صفحه محیط پایتون مراجعه کنید.

import ee
import geemap.core as geemap

کولب (پایتون)

# Load a VIIRS 8-day surface reflectance composite for September 2024.
viirs202409 = (
    ee.ImageCollection('NASA/VIIRS/002/VNP09H1')
    .filter(ee.Filter.date('2024-09-01', '2024-09-16'))
    .first()
)

# Compute multi-band difference between the September composite and the
# previously loaded May composite.
diff = viirs202409.subtract(ndvi202405)

m = geemap.Map()
m.add_layer(
    diff,
    {
        'bands': ['SurfReflect_I1', 'SurfReflect_I2', 'SurfReflect_I3'],
        'min': -1,
        'max': 1,
    },
    'difference',
)

# Compute the squared difference in each band.
squared_difference = diff.pow(2)

m.add_layer(
    squared_difference,
    {
        'bands': ['SurfReflect_I1', 'SurfReflect_I2', 'SurfReflect_I3'],
        'min': 0,
        'max': 0.7,
    },
    'squared diff.',
)
display(m)

در قسمت دوم این مثال، اختلاف مجذور با استفاده از image.pow(2) محاسبه می‌شود. برای فهرست کامل عملگرهای ریاضی که محاسبات پایه، مثلثات، توان، گرد کردن، ریخته‌گری، عملیات بیتی و موارد دیگر را مدیریت می‌کنند، به مستندات API مراجعه کنید.

عبارات

برای پیاده‌سازی عبارات پیچیده‌تر ریاضی، استفاده از image.expression() را در نظر بگیرید که نمایش متنی یک عملیات ریاضی را تجزیه می‌کند. مثال زیر از expression() برای محاسبه شاخص گیاهی پیشرفته (EVI) استفاده می کند:

ویرایشگر کد (جاوا اسکریپت)

// Load a Landsat 8 image.
var image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318');

// Compute the EVI using an expression.
var evi = image.expression(
    '2.5 * ((NIR - RED) / (NIR + 6 * RED - 7.5 * BLUE + 1))', {
      'NIR': image.select('B5'),
      'RED': image.select('B4'),
      'BLUE': image.select('B2')
});

Map.centerObject(image, 9);
Map.addLayer(evi, {min: -1, max: 1, palette: ['a6611a', 'f5f5f5', '4dac26']});

راه اندازی پایتون

برای اطلاعات در مورد API پایتون و استفاده از geemap برای توسعه تعاملی به صفحه محیط پایتون مراجعه کنید.

import ee
import geemap.core as geemap

کولب (پایتون)

# Load a Landsat 8 image.
image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318')

# Compute the EVI using an expression.
evi = image.expression(
    '2.5 * ((NIR - RED) / (NIR + 6 * RED - 7.5 * BLUE + 1))',
    {
        'NIR': image.select('B5'),
        'RED': image.select('B4'),
        'BLUE': image.select('B2'),
    },
)

# Define a map centered on San Francisco Bay.
map_evi = geemap.Map(center=[37.4675, -122.1363], zoom=9)

# Add the image layer to the map and display it.
map_evi.add_layer(
    evi, {'min': -1, 'max': 1, 'palette': ['a6611a', 'f5f5f5', '4dac26']}, 'evi'
)
display(map_evi)

توجه داشته باشید که اولین آرگومان برای expression() نمایش متنی عملیات ریاضی است، آرگومان دوم یک فرهنگ لغت است که در آن کلیدها نام متغیرهای مورد استفاده در عبارت هستند و مقادیر نوارهای تصویری هستند که متغیرها باید به آنها نگاشت شوند. باندهای موجود در تصویر ممکن است به‌جای ارائه فرهنگ لغت به‌عنوان b("band name") یا b(index) نامیده شوند، برای مثال b(0) . هنگام استفاده از فرهنگ لغت نقشه نوار، باندها را می توان از تصاویری غیر از ورودی تعریف کرد. توجه داشته باشید که expression() از «تقسیم طبقه» استفاده می‌کند که باقیمانده را کنار می‌گذارد و وقتی دو عدد صحیح تقسیم می‌شوند یک عدد صحیح برمی‌گرداند. به عنوان مثال 10 / 20 = 0 . برای تغییر این رفتار، یکی از عملوندها را در 1.0 ضرب کنید: 10 * 1.0 / 20 = 0.5 . تنها تقاطع پیکسل‌های بدون ماسک در نظر گرفته می‌شود و زمانی که باندهای بیش از یک تصویر منبع ارزیابی می‌شوند، به‌عنوان بدون نقاب برگردانده می‌شوند. عملگرهای عبارت پشتیبانی شده در جدول زیر فهرست شده اند.

عملگرهای expression()
تایپ کنید نماد نام
حسابی + - * / % ** جمع، تفریق، ضرب، تقسیم، مدول، توان
رابطه ای == != < > <= >= مساوی، نه مساوی، کمتر از، بزرگتر از و غیره.
منطقی && || ! ^ و، یا، نه، Xor
سه تایی ? : اگر پس دیگر