首先要知道去云的本质是掩膜,现对GEE两种常见的去云函数进行对比:
第一种来源于官方文档(网址:https://developers.google.com/earth-engine/guides/getstarted)
代码如下:
// This function masks cloudy pixels.
var cloudMask = function(image) {
var clouds = ee.Algorithms.Landsat.simpleCloudScore(image).select(['cloud']);
return image.updateMask(clouds.lt(10));
};
第二种利用QA_PIXEL波段,代码如下:
// 去云函数
function removeCloud(image){
var qa = image.select('QA_PIXEL')
var cloudMask = qa.bitwiseAnd(1 << 3).eq(0)
var cloudShadowMask = qa.bitwiseAnd(1 << 5).eq(0)
var valid = cloudMask.and(cloudShadowMask)
return image.updateMask(valid)
}
数据准备:
选取了一景含云量为99.97%的Landsat 8影像,ID号为:LANDSAT/LC08/C02/T1_TOA/LC08_127042_20220314。
结果比较:
直接在envi里查看结果如下:
云量为99.97的原始影像:
cloudMask结果:
removeCloud结果:
由此可知,removeCloud的去云效果更为彻底,当然cloudMask也可以调整阈值来获得更好的效果,cloudMask还具有代码简洁的优点。
注:这里导出的影像是经过roi裁剪的,未裁剪的影像导出大约慢5分钟!
完整代码如下:
// For a Landsat Image:
// data to prepare
var L8CloudMax = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_127042_20220314');
// to view the metadata
// print(L8CloudMax)
// Map.centerObject(L8CloudMax,7)
// Map.addLayer(L8CloudMax.select(['B4', 'B3', 'B2']), {}, 'L8CloudMax')
Export.image.toDrive({
image: L8CloudMax.select(['B4', 'B3', 'B2']),
description: 'L8CloudMax',
folder: 'GEE_downloads',
scale: 30,
// region: roi,
crs: 'EPSG: 4326'
});
//__________________________________________________________________________________________________________________________________________________________
// this funcion supplied by gee normal, control the threshold to achieve an ideal effect
var cloudMask = function(image){
var clouds = ee.Algorithms.Landsat.simpleCloudScore(image).select(['cloud'])
return image.updateMask(clouds.lt(10))
}
var maskedImg = cloudMask(L8CloudMax)
// Map.centerObject(maskedImg,7)
// Map.addLayer(maskedImg.select(['B4', 'B3', 'B2']), {}, 'maskedImg')
Export.image.toDrive({
image: maskedImg.select(['B4', 'B3', 'B2']),
description: 'maskedImg',
folder: 'GEE_downloads',
scale: 30,
// region: roi,
crs: 'EPSG: 4326'
});
//__________________________________________________________________________________________________________________________________________________________
// this function supplied by online, has a better effect than above
function removeCloud(image){
var qa = image.select('QA_PIXEL')
var cloudMask = qa.bitwiseAnd(1 << 3).eq(0)
var cloudShadowMask = qa.bitwiseAnd(1 << 5).eq(0)
var valid = cloudMask.and(cloudShadowMask)
return image.updateMask(valid)
}
var removedImg = removeCloud(L8CloudMax)
// Map.centerObject(removedImg,7)
// Map.addLayer(removedImg.select(['B4', 'B3', 'B2']), {}, 'removedImg')
Export.image.toDrive({
image: removedImg.select(['B4', 'B3', 'B2']),
description: 'removedImg',
folder: 'GEE_downloads',
scale: 30,
// region: roi,
crs: 'EPSG: 4326'
});