您可以使用 add()
和 subtract()
等运算符执行图像数学运算,但对于包含多个项的复杂计算,expression()
函数是一个不错的替代方案。如需详细了解运算符和表达式,请参阅以下部分。
运算符
数学运算符可对图像波段执行基本算术运算。它们接受两个输入:两张图片或一张图片和一个常数项,该常数项被解释为没有经过掩码的单波段常量图片。系统会针对每个波段的每个像素执行操作。
作为一个基本示例,请考虑使用 VIIRS 图像计算归一化差异植被指数 (NDVI) 的任务,其中使用了 add()
、subtract()
和 divide()
运算符:
Code Editor (JavaScript)
// 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')));
import ee import geemap.core as geemap
Colab (Python)
# 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') ) ) )
系统只会考虑两个输入之间未遮罩像素的交集,并将其返回为未遮罩,所有其他像素均会被遮罩。通常,如果任一输入只有一个频段,则该频段将用于对另一输入中的所有频段进行处理。如果输入具有相同的波段数,但名称不同,则会按自然顺序成对使用。输出频段的命名方式取决于两个输入中较长的输入,如果两个输入的长度相同,则按第一个输入的顺序命名。输出像素的类型是输入类型的并集。
以下多波段图像减法示例演示了如何自动匹配波段,从而为每个共存波段的每个像素生成“变化矢量”。
Code Editor (JavaScript)
// 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.');
import ee import geemap.core as geemap
Colab (Python)
# 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):
Code Editor (JavaScript)
// 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']});
import ee import geemap.core as geemap
Colab (Python)
# 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
。在评估来自多个源图像的波段时,系统只会考虑未遮盖像素的交集,并将其返回为未遮盖。下表列出了支持的表达式运算符。
类型 | 符号 | 名称 |
---|---|---|
算术 | + - * / % ** | 加减乘除、模运算、指数 |
关系 | == != < > <= >= | 等于、不等于、小于、大于等。 |
逻辑 | && || ! ^ | And、Or、Not、Xor |
三元组 | ? : | if then else |