代码来源:https://developers.google.com/earth-engine/datasets/catalog/COPERNICUS_S2_SR_HARMONIZED#description
讲解一下GEE示例
/*** Function to mask clouds using the Sentinel-2 QA band* @param {ee.Image} image Sentinel-2 image* @return {ee.Image} cloud masked Sentinel-2 image*/
function maskS2clouds(image) {var qa = image.select('QA60');// Bits 10 and 11 are clouds and cirrus, respectively.var cloudBitMask = 1 << 10;var cirrusBitMask = 1 << 11;// Both flags should be set to zero, indicating clear conditions.var mask = qa.bitwiseAnd(cloudBitMask).eq(0).and(qa.bitwiseAnd(cirrusBitMask).eq(0));return image.updateMask(mask).divide(10000);
}var dataset = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED').filterDate('2020-01-01', '2020-01-30')// Pre-filter to get less cloudy granules..filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE',10)).map(maskS2clouds);var visualization = {min: 0.0,max: 0.3,bands: ['B4', 'B3', 'B2'],
};Map.setCenter(83.277, 17.7009, 12);Map.addLayer(dataset.mean(), visualization, 'RGB');
QA60是Sentinel-2影像中的一种质量控制波段,用于记录每个像素点的质量信息。具体来说,QA60波段记录了每个像素的60个质量控制位,每个位代表了一个特定的质量标志,如云、阴影、雪等。其中,第10位是云,第11位是卷云。
因此这段代码前半部分构造了一个 maskS2clouds() 的函数,根据对应位的数值构造掩膜。
var mask = qa.bitwiseAnd(cloudBitMask).eq(0).and(qa.bitwiseAnd(cirrusBitMask).eq(0));
这段代码表示,如果这个像素没受 云 影响,也没受 卷云 影响,那么就为这个像素构造掩膜
return image.updateMask(mask).divide(10000);
image.updateMask() 这个函数将image中所有mask值为1的像素保留,然后又将每个像素的DN值归一化 (Sentinel-2 的DN值范围:0-10000)
后续代码就是将对应时间内,云量少于20%的影像进行掩膜处理,并平均的覆盖地图上的每一个位置。
如果想看不进行掩膜去云处理的图像进行对比,可以运行以下代码:
/*** Function to mask clouds using the Sentinel-2 QA band* @param {ee.Image} image Sentinel-2 image* @return {ee.Image} cloud masked Sentinel-2 image*/
function maskS2clouds(image) {var qa = image.select('QA60');// Bits 10 and 11 are clouds and cirrus, respectively.var cloudBitMask = 1 << 10;var cirrusBitMask = 1 << 11;// Both flags should be set to zero, indicating clear conditions.var mask = qa.bitwiseAnd(cloudBitMask).eq(0).and(qa.bitwiseAnd(cirrusBitMask).eq(0));return image.updateMask(mask).divide(10000);
}var dataset = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED').filterDate('2020-01-01', '2020-01-30')// Pre-filter to get less cloudy granules..filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE',10)) //可以把“10”改大一点,更明显
// .map(maskS2clouds);var visualization = {min: 0,max: 10000,bands: ['B4', 'B3', 'B2'],
};Map.setCenter(83.277, 17.7009, 12);Map.addLayer(dataset.mean(), visualization, 'RGB');