在GEE中实现时,发现简单的QA60是无法去云的,最近S2地表反射率数据集又进行了更新,原有的属性集也进行了变化,现在的SR数据集名称是"S2_SR_HARMONIZED"。那么:
要想得到研究区无云的图像,可以参考执行以下几个步骤,
-
遥感图像中筛选云占比不超过10%的图像
// 加载Sentinel-2 L2A图像
var s2 = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')
.filterDate('2021-09-01', '2021-10-31')
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE',10))
.filterBounds(basin_shp);
-
QA60云掩膜
// 第一次云掩膜:使用QA60
function maskS2clouds(image) {
var qa = image.select('QA60');
var cloudBitMask = 1 << 10;
var cirrusBitMask = 1 << 11;
var mask = qa.bitwiseAnd(cloudBitMask).eq(0)
.and(qa.bitwiseAnd(cirrusBitMask).eq(0));
return image.updateMask(mask);
}
var s2_masked = s2.map(maskS2clouds);
-
SCL在最新的S2_SR_HARMONIZED产品中是存在的,判断云和云阴影
//SCL Cloud mask
function maskS2cloudsSCL(image) {
var scl = image.select('SCL');
// 去除云(8)和云阴影(9)
var mask = scl.neq(8).and(scl.neq(9));
return image.updateMask(mask);
}
var s2_masked = s2_masked.map(maskS2cloudsSCL);
-
继续用像元云概率进行判断,要求每个像元是云的概率小于10%
// MSK_CLDPRB Mask(Sen2Cor 云概率),可直接用阈值掩膜,云概率低于 10% 保留:
function maskCloudProb(image) {
var prob = image.select('MSK_CLDPRB');
return image.updateMask(prob.lt(10)); // 云概率低于 20% 保留
}
var s2_masked = s2_masked.map(maskCloudProb);
最后中位数合成,避免反射率高值影响图像像元整体性。
var s2_max = s2_masked.median();