本文介绍了一种使用Google Earth Engine(GEE)平台进行遥感影像处理的方法,该方法可以将一幅遥感影像转换成植被覆盖度(Fraction of Vegetation Cover,FVC)影像,同时去除云和阴影干扰。
结果如下图所示,
F V C = l e s s P a r t ∗ 0 + m i d d l e P a r t ∗ ( N D V I − 5 % 分位数 ) / ( 95 % 分位数 − 5 % 分位数 ) + g r e a t e r P a r t ∗ 1 FVC =lessPart * 0 + middlePart * (NDVI - 5\%分位数) / (95\%分位数 - 5\%分位数) + greaterPart * 1 FVC=lessPart∗0+middlePart∗(NDVI−5%分位数)/(95%分位数−5%分位数)+greaterPart∗1
//导入矢量边界
var roi = table
//去云函数
function rmCloud(image) {
var cloudShadowBitMask = (1 << 3);
var cloudsBitMask = (1 << 5);
var qa = image.select("pixel_qa")
var mask = qa.bitwiseAnd(cloudShadowBitMask).eq(0)
.and(qa.bitwiseAnd(cloudsBitMask).eq(0));
return image.updateMask(mask);
}
//筛选数据,并计算NDVI,添加NDVI波段
var bestNDVI=ee.ImageCollection("LANDSAT/LE07/C01/T1_SR")
.filterDate("2000-04-01","2000-10-31")
.filterBounds(roi)
.map(rmCloud)
.map(function(image){
var ndvi=image.normalizedDifference(["B4","B3"]);
return image.addBands(ndvi.rename("NDVI"))
})
.qualityMosaic("NDVI")
.clip(roi)
.select("NDVI");
Map.centerObject(roi,8);
Map.addLayer(bestNDVI,{},"bestNDVI");
//calculate the 5% and 95% num of the image
var num =bestNDVI.reduceRegion({
reducer:ee.Reducer.percentile([5,95]),
geometry:roi,
scale:30,
maxPixels:1e13
});
print("num",num);
//将NDVI从小到大的顺序排序
//然后把位于第5%位置的NDVI作为最小值
//把位于95%的NDVI作为最大值
var min = ee.Number(num.get("NDVI_p5"));
var max = ee.Number(num.get("NDVI_p95"));
print("min",min);//将值打印到控制台
print("max",max)
计算给定区域内 NDVI 数据的 5% 和 95% 两个百分位数,并将结果存储在 num 变量中。
以下是代码中使用的参数的含义:
计算结果存储在 num 变量中,是一个包含 5% 和 95% 两个值的对象。可以通过 num.get() 方法获取其中的具体值。
var greaterPart = bestNDVI.gt(max);
var lessPart = bestNDVI.lt(min);
这两行代码定义了两个图像变量 greaterPart 和 lessPart,它们分别表示比给定的最大值 max 大和比给定的最小值 min 小的部分。利用 ee.Image.gt() 和 ee.Image.lt() 这两个方法来实现图像的比较运算,它们将返回一个由 0 和 1 组成的二元图像,表示图像中每个像素点是否满足大于或小于给定的值。
var middlePart =ee.Image(1).subtract(greaterPart).subtract(lessPart);
// get the middle part
这一行代码定义了一个变量 middlePart,用于表示介于给定的最小值和最大值之间的部分。利用 ee.Image.subtract() 方法来实现两个二元图像的差运算,从而得到中间部分的二元图像。由于 greaterPart 和 lessPart 取值为 0 或 1,因此它们的差值也只会取 0 或 1,从而得到中间部分的二元图像。
//var mask=bestNDVI.gt(mim).add(bestNDVI.lt(min));
//var middlePart=bestNDVI.updateMask(mask);
使用 ee.Image() 这个构造函数来创建一个初始值为 1 的图像。这个图像中的每个像素点的值都为 1,可以用于与其他二元图像进行运算,从而得到所需的结果。
这两行代码是被注释掉的,是原作者可能尝试过的无用代码。其中,第一行代码利用 ee.Image.add() 方法将 bestNDVI.gt(mim) 和 bestNDVI.lt(min) 的结果进行加运算,得到一个表示不在给定范围内的像素点的二元图像。第二行代码利用 ee.Image.updateMask() 方法将不在给定范围内的像素点的值设为 null。
var tempf1=bestNDVI.subtract(min).divide(max.subtract(min));
这一行代码定义了一个变量 tempf1,表示 NDVI 图像的标准化值。首先使用 ee.Image.subtract() 和 ee.Image.divide() 方法分别计算 NDVI 图像与给定的最小值 min 的差值和最大值 max 与最小值 min 的差值,然后将这两个结果相除得到标准化的 NDVI 值。
var FVC = ee.Image(1)
.multiply(greaterPart)
.add(ee.Image(0).multiply(lessPart))
.add(tempf1.multiply(middlePart))
.toFloat();
这里定义了一个变量 FVC,用于表示计算得到的 FVC 图像。首先使用 ee.Image.multiply() 方法将二元图像 greaterPart 与常数图像 ee.Image(1) 相乘,得到一个表示大于给定最大值的像素点的图像;然后使用 ee.Image.multiply() 方法将二元图像 lessPart 与常数图像 ee.Image(0) 相乘,得到一个表示小于给定最小值的像素点的图像。最后,使用 ee.Image.add() 方法将这三部分图像相加得到最终的 FVC 图像。
由于 GEE 中图像的数据类型默认是双精度浮点型(Double),而 FVC 的值只能在 0 到 1 之间,因此我们在这里使用了 ee.Image.toFloat() 方法将 FVC 图像转换为单精度浮点型(Float)。
Map.addLayer(FVC,{},"FVC");
这一行代码将计算得到的 FVC 图像添加到地图上进行可视化。
//导出⽂文件到Drive
Export.image.toDrive({
image: FVC,
description: "2000fvc",
fileNamePrefix: "2000fvc",
folder: " 20230406fvc",
scale: 30,
region: roi,
maxPixels: 1e13
});
Export.image.toDrive() 是 Google Earth Engine API 中用于将图像导出到 Google Drive 上的方法。它包含以下参数:
https://code.earthengine.google.com/7425c635319e2a0b08b64d452cec00f9?noload=true