GEE实战5分钟搞定Sentinel-2影像的云掩膜与真彩色合成附完整代码第一次接触Google Earth EngineGEE时最让我头疼的就是处理Sentinel-2影像的云层遮挡问题。记得有次需要分析某地区植被变化结果下载的影像60%都被云覆盖简直欲哭无泪。后来发现GEE平台其实内置了强大的云掩膜功能配合简单的代码就能快速获得清晰影像。本文将手把手教你如何用5分钟完成从数据加载到可视化输出的全流程。1. 准备工作认识Sentinel-2数据在开始操作前我们需要了解几个关键点数据版本选择GEE提供两种Sentinel-2数据COPERNICUS/S2原始L1C级数据COPERNICUS/S2_SR经过大气校正的L2A级数据推荐使用波段分辨率差异10米分辨率B2蓝、B3绿、B4红、B8近红外20米分辨率B5-B7、B8A、B11-B1260米分辨率B1、B9、B10小技巧真彩色合成只需要B4红、B3绿、B2蓝三个波段这也是为什么我们能看到接近自然色彩的影像。2. 快速加载Sentinel-2影像登录GEE平台后在代码编辑器中输入以下基础代码// 定义研究区域以杭州西湖为例 var roi ee.Geometry.Point(120.15, 30.25).buffer(5000); // 加载Sentinel-2 SR数据集 var s2 ee.ImageCollection(COPERNICUS/S2_SR) .filterBounds(roi) .filterDate(2023-06-01, 2023-06-30) .filter(ee.Filter.lt(CLOUDY_PIXEL_PERCENTAGE, 20)); // 选择最新的一景影像 var image ee.Image(s2.first());注意CLOUDY_PIXEL_PERCENTAGE是元数据中的云量百分比字段这里设置小于20%确保影像相对清晰。3. 两种云掩膜方法实战3.1 使用QA60波段进行云掩膜QA60是GEE提供的质量评估波段特别适合快速云检测// 提取QA60波段 var qa60 image.select(QA60); // 创建云掩膜第10位是不透明云第11位是卷云 var cloudBitMask 1 10; var cirrusBitMask 1 11; // 应用掩膜 var maskedImage image.updateMask( qa60.bitwiseAnd(cloudBitMask).eq(0) .and(qa60.bitwiseAnd(cirrusBitMask).eq(0)) );3.2 使用MSK_CLDPRB波段更精确对于2020年后的数据推荐使用云概率波段// 加载云概率波段值范围0-100 var cldProb image.select(MSK_CLDPRB); // 设置阈值大于30视为云 var cloudThreshold 30; var maskedImage image.updateMask(cldProb.lt(cloudThreshold));实测对比在相同区域MSK_CLDPRB比QA60平均多保留5-8%的有效像素。4. 真彩色合成与可视化完成云掩膜后我们可以进行可视化输出// 真彩色合成参数 var trueColor { bands: [B4, B3, B2], min: 0, max: 3000, gamma: 1.2 }; // 添加到地图 Map.centerObject(roi, 12); Map.addLayer(maskedImage, trueColor, True Color);如果需要保存结果可以使用导出功能Export.image.toDrive({ image: maskedImage.visualize(trueColor), description: Sentinel2_TrueColor, scale: 10, region: roi, fileFormat: GeoTIFF });5. 进阶技巧波段组合与增强除了真彩色GEE还支持多种波段组合组合类型波段顺序适用场景假彩色B8-B4-B3植被监测农业B11-B8-B2作物健康地质B12-B11-B4岩性识别例如创建NDVI归一化植被指数var ndvi maskedImage.normalizedDifference([B8, B4]).rename(NDVI); Map.addLayer(ndvi, {min:0, max:1, palette:[white, green]}, NDVI);6. 常见问题解决方案问题1影像出现色偏检查点确认波段缩放系数默认0.0001修复代码var scaled image.multiply(0.0001);问题2云掩膜不彻底解决方案组合使用QA60和MSK_CLDPRBvar finalMask qa60.bitwiseAnd(cloudBitMask).eq(0) .and(cldProb.lt(20));问题3影像缺失波段原因可能是早期L2A数据替代方案使用COPERNICUS/S2_CLOUD_PROBABILITY数据集辅助记得第一次成功去除云层看到清晰影像时那种成就感至今难忘。现在每次处理新区域我都会先运行这套标准化流程确保数据质量可靠。