数据科学家或数据分析师不仅可以从时间序列数据中提取信息和洞察,还可以从图像数据中获得。本文将展示如何使用Google Earth Engine(简称Earth Engine)进行卫星图像分析。卫星图像是像任何图像一样的栅格数据,不同的是卫星图像具有空间属性,每个像素代表现实世界中的一个位置。分析卫星图像意味着将获得有关研究区域内内容的信息。专注于这一领域的科学是遥感技术。
Earth Engine是一个执行遥感的平台,比如卫星图像分析。它拥有许多卫星图像存档。不会在这里过多解释Earth Engine和遥感,因为在另一篇文章中已经做过了。如果不熟悉遥感或Earth Engine,请在那篇文章中寻找简单的解释。那篇文章实际上展示了如何将机器学习应用于Landsat 8图像的土地覆盖检测。
本文的目标是处理图像并返回使用Landsat 8图像的归一化植被指数(NDVI)。NDVI是卫星图像分析中常用的一个指数,用于获取有关植被分布的基本资料。然后,将NDVI值分类为5个类别并进行映射。最后,将展示如何导出结果。
Landsat 8图像像其他图像一样由像素组成。每个像素包含值。彩色图像通常有3个波段,即红色、绿色和蓝色,而Landsat 8有11个波段。用于生成NDVI的两个波段是波段5(NIR)和波段4(红色)。图1显示了对3个对象的光谱响应曲线。绿色曲线代表对植被的光谱响应。可以看到,植被反射NIR最多,吸收红色光谱最多。其他对象具有不同的特征。水几乎不反射红色光谱,反射所有NIR。土壤反射的NIR比植被少,但反射的红色光谱比植被多。
NDVI方程表示为NDVI = (NIR - 红色) / (NIR + 红色)。从方程中可以看出,NDVI旨在看到NIR和红色光谱之间的归一化差异。差异越大或NDVI值越高,像素中的对象更可能是植被,如森林和农作物。较低的NDVI值意味着对象可能是其他对象,如水、土壤、定居点、云或阴影。
现在,将开始演示。首先,决定研究区域以分析NDVI图像。图2中的红色正方形用来设置印度尼西亚爪哇的研究区域边界。然后,导入Landsat 8图像集合。Landsat 8图像从2013年至今都有。本文中,只加载2020年6月至2020年8月的图像,并提取它们的中值,因为这些月份通常在研究区域内云覆盖较少。加载的图像使用红色正方形剪裁并命名为“合成图”。
否则,将使Earth Engine负担起分析整个世界的图像。现在,可以使用合成波段6、5和4来可视化图像。这是显示植被假彩色的最佳合成。
计算NDVI的代码如下。上述已经解释了方程。NDVI光栅以绿黄黑渐变显示。绿色代表较高的NDVI值,其次是黄色,黑色代表较低的NDVI。请注意,像海这样的水体是黑色的。陆地大部分是黄色,有一点绿色。可以使用“检查器”识别像素值。
// 计算NDVI
var nir = image.select('B5');
var red = image.select('B4');
var ndvi = nir.subtract(red).divide(nir.add(red));
var ndvi = ndvi.clip(geometry);
// 添加地图层
Map.addLayer(ndvi, {min: 0, max: 1, palette: ['black', 'yellow', 'green']}, '连续NDVI',false);
还可以计算NDVI值的整体平均值和标准差,使用以下代码。NDVI值为0.314 ± 0.304。
// 计算NDVI的平均值和标准差
var mean_ndvi = ndvi.reduceRegion({
reducer: ee.Reducer.mean(),
geometry: geometry,
scale: 30
});
var sd_ndvi = ndvi.reduceRegion({
reducer: ee.Reducer.stdDev(),
geometry: geometry,
scale: 30
});
print(mean_ndvi);
print(sd_ndvi);
通过分类NDVI值可以更好地理解NDVI结果。在这里,将NDVI值分类为5个类别。每个类别都用不同的颜色表示。这些类别与土地覆盖有关。
// 将NDVI分类为5个类别
var ndvi2 = ee.Image(1)
.where(ndvi.gt(0.0).and(ndvi.lte(0.2)), 2)
.where(ndvi.gt(0.2).and(ndvi.lte(0.4)), 3)
.where(ndvi.gt(0.4).and(ndvi.lte(0.6)), 4)
.where(ndvi.gt(0.6), 5)
var ndvi2 = ndvi2.clip(geometry);
// 添加地图层
Map.addLayer(ndvi2, {min: 1, max: 5, palette: ['#654321','#FFA500','#FFFF00', '#00FF00', '#008000']}, '分类NDVI',true);
接下来要做的事情是添加地图标题和图例。地图标题是“NDVI地图”。图例将描述NDVI值范围。
// 添加地图标题
var mapTitle = ui.Panel({
style: {
position: 'top-center',
padding: '8px 15px'
}
});
var mapTitle2 = ui.Label({
value: 'NDVI地图',
style: {
fontWeight: 'bold',
fontSize: '20px',
margin: '0 0 3px 0',
padding: '0'
}
});
mapTitle.add(mapTitle2);
Map.add(mapTitle);
// 添加地图图例
var legend = ui.Panel({
style: {
position: 'bottom-right',
padding: '8px 15px'
}
});
var legend2 = ui.Label({
value: '图例 (NDVI)',
style: {
fontWeight: 'bold',
fontSize: '18px',
margin: '0 0 4px 0',
padding: '0'
}
});
legend.add(legend2);
// 创建图例内容
var content = function(color, label) {
var box = ui.Label({
style: {
backgroundColor: '#' + color,
padding: '9px',
margin: '0 0 4px 0'
}
});
var labels = ui.Label({
value: label,
style: {margin: '0 0 4px 6px'}
});
return ui.Panel({
widgets: [box, labels],
layout: ui.Panel.Layout.Flow('horizontal')
});
};
// 设置图例颜色
var classcolor = ['654321','FFA500','FFFF00', '00FF00', '008000'];
// 设置图例标签
var labelName = ['<=0','0 - 0.2','0.2 - 0.4','0.4 - 0.6', '>0.6'];
// 组合图例颜色和标签
for (var i = 0; i < 5; i++) {
legend.add(content(classcolor[i], labelName[i]));
}
// 添加图例
Map.add(legend);
从上面的图中,可以更清楚地看到5个NDVI类别。水以棕色表示,因为它的NDVI值最低。NDVI值在0到0.2之间的定居点和水产养殖以橙色表示。黄色和浅绿色类别是农作物。绿色类别中的农作物NDVI值高于黄色类别,这意味着绿色类别中的农作物密度更高、产量更高或比黄色类别中的农作物更健康。只能找到很少的深绿色植被。可以假设只有很少的森林。
最后要做的事情是可能想要保存结果。为此,可以将3个图像导出到Google Drive以供以后下载。以下是代码。运行代码后,将在“任务”中找到三个结果。点击右侧的3个“运行”按钮,导出过程将开始。
// 导出并保存到驱动器
Export.image.toDrive({
image: ndvi2,
description: '分类NDVI',
scale: 30,
fileFormat: 'GeoTIFF',
region: geometry
});
Export.image.toDrive({
image: ndvi,
description: '连续NDVI',
scale: 30,
fileFormat: 'GeoTIFF',
region: geometry
});
Export.image.toDrive({
image: composite,
description: '合成654',
scale: 30,
fileFormat: 'GeoTIFF',
region: geometry
});