在遥感影像处理中,云覆盖是影响数据质量的主要挑战。下面将围绕Landsat 8云掩膜与去云处理的核心代码展开解析,帮助理解不同方法的技术原理与应用场景。
一、Landsat 8影像筛选与云量初步过滤
// 筛选Landsat 8影像并进行云量初步筛选
var landsat8 = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA')
.filterBounds(userDrawnRectangle)
.filterDate(startDate, endDate)
.filterMetadata('CLOUD_COVER', 'less_than', 25) // 云量小于25%
.filterMetadata('CLOUD_COVER', 'greater_than', 5); // 确保有一定云量用于测试
核心解析:
- 数据筛选:通过
filterBounds
和filterDate
限定空间范围与时间区间,确保获取目标区域的影像。 - 云量过滤:
CLOUD_COVER
元数据表示整景影像的云覆盖比例,less_than 25
排除高云量影像,greater_than 5
避免无云场景(无法测试云处理效果)。
二、云掩膜核心方法:从基础到增强
1. 原始云掩膜(基于Landsat标准QA波段)
function maskCloudsOriginal(image) {
var qa = image.select('QA_PIXEL');
var cloud = qa.bitwiseAnd(1 << 3).or(qa.bitwiseAnd(1 << 4)); // 高置信度云+云阴影
var cirrus = qa.bitwiseAnd(1 << 2); // 卷云
return image.updateMask(cloud.not()).updateMask(cirrus.not());
}
核心解析:
- QA_PIXEL波段:Landsat 8的质量评估波段通过二进制位存储云信息:
1 << 3
(bit3):高置信度云(置信度≥90%)1 << 4
(bit4):云阴影1 << 2
(bit2):卷云(高层薄云)
- 掩膜逻辑:通过
bitwiseAnd
提取云位,not()
取反后用updateMask
屏蔽云区域。
2. 增强型云掩膜(多条件复合检测)
function maskCloudsEnhanced(image) {
var qa = image.select('QA_PIXEL');
// 增强型云检测:高/中等置信度云+云阴影
var cloud = qa.bitwiseAnd(1 << 3).or(qa.bitwiseAnd(1 << 5)).or(qa.bitwiseAnd(1 << 4));
// 薄云与雪掩膜:卷云+雪/冰
var cirrus = qa.bitwiseAnd(1 << 2).or(qa.bitwiseAnd(1 << 8));
// 亮度阈值辅助检测(近红外高反射率可能为云)
var bright = image.select('B5').gt(0.3);
return image.updateMask(cloud.not()).updateMask(cirrus.not()).updateMask(bright.not());
}
核心解析:
- 新增检测条件:
1 << 5
(bit5):中等置信度云(置信度50%-90%)1 << 8
(bit8):雪/冰(易与云混淆)B5 > 0.3
:近红外波段(B5)高反射率,云通常在近红外表现为高亮
- 应用场景:适用于多云、多雪地区,减少云漏检。
3. 基于NDSI的雪/云分离掩膜
function maskCloudsSnow(image) {
var ndsi = image.normalizedDifference(['B3', 'B6']); // NDSI = (B3-B6)/(B3+B6)
var snow = ndsi.gt(0.4); // 雪掩膜
var cloudMask = maskCloudsOriginal(image); // 原始云掩膜
return cloudMask.updateMask(snow.not()); // 排除雪区域
}
核心解析:
- NDSI原理:NDSI对积雪敏感(B3绿光波段对雪反射强,B6短波红外对雪反射弱),雪区NDSI>0.4。
- 去混淆逻辑:雪与云在QA波段易混淆,通过NDSI分离雪,避免将雪误判为云。
4. 基于NDVI的云掩膜(光谱特征联合检测)
function maskCloudsNDVI(image) {
var ndvi = image.normalizedDifference(['B5', 'B4']); // NDVI = (B5-B4)/(B5+B4)
var ndsi = image.normalizedDifference(['B3', 'B6']); // NDSI
// 云的光谱特征:低NDVI+高反射率,或高NDSI(雪)
var lowNDVI = ndvi.lt(0.2);
var highReflectance = image.select('B4').gt(0.25).and(image.select('B3').gt(0.25)).and(image.select('B2').gt(0.25));
var cloud = lowNDVI.and(highReflectance).or(ndsi.gt(0.4));
return image.updateMask(cloud.not());
}
核心解析:
- 云的光谱特征:
- 植被区NDVI>0.2,云区NDVI通常<0.2;
- 云在可见光波段(B2/B3/B4)反射率高(>0.25),与地表形成差异;
- 联合检测:通过NDVI、NDSI和反射率阈值多重条件降低误检率。
三、去云处理:从时间序列中恢复地表信息
1. 中值合成去云(静态填充)
function cloudRemovalMedian(collection) {
var median = collection.median(); // 计算时间序列中值影像
return collection.map(function(image) {
var masked = maskCloudsOriginal(image); // 先掩膜云
var filled = masked.unmask(median); // 用中值填充云区
return filled.copyProperties(image, ['system:time_start']);
});
}
核心解析:
- 中值合成:
collection.median()
计算整个时间序列的中值影像,代表该区域的"典型地表"。 - 填充逻辑:用中值影像填充当前影像的云掩膜区域,适用于地表特征变化缓慢的场景(如裸地、建筑)。
2. 时间序列前后帧插值去云(动态填充)
function cloudRemovalTemporal(collection) {
return collection.map(function(image) {
var masked = maskCloudsEnhanced(image); // 增强型掩膜
var time = ee.Date(image.get('system:time_start'));
// 提取前30天和后30天的中值影像
var before = collection.filterDate(time.advance(-30, 'day'), time).median();
var after = collection.filterDate(time, time.advance(30, 'day')).median();
// 用前后中值的平均值填充云区
var fill = before.add(after).divide(2);
var filled = masked.unmask(fill);
return filled.copyProperties(image, ['system:time_start']);
});
}
核心解析:
- 时间序列插值:利用云区前后30天的无云(或少云)影像计算中值,通过
(前值+后值)/2
插值填充。 - 动态适应性:相比中值合成,该方法更适用于地表特征随时间变化的场景(如植被生长、水体变化)。
四、云掩膜可视化与结果导出
// 完整云掩膜(包含云、阴影、卷云、雪)
var fullCloudMask = qa.bitwiseAnd(1 << 3)
.or(qa.bitwiseAnd(1 << 5)).or(qa.bitwiseAnd(1 << 4))
.or(qa.bitwiseAnd(1 << 2)).or(qa.bitwiseAnd(1 << 8))
.or(selectedImage.select('B5').gt(0.3));
// 导出云掩膜结果
Export.image.toDrive({
image: fullCloudMask.clip(userDrawnRectangle).selfMask(),
description: 'FullCloudMask',
scale: 30,
region: userDrawnRectangle,
maxPixels: 1e13,
fileFormat: 'GeoTIFF'
});
核心解析:
- 可视化逻辑:通过
palette: ['blue', 'red']
将云掩膜(值为1)显示为红色,非云区(值为0)显示为蓝色。 - 结果导出:
selfMask()
将掩膜转换为二值影像(0和1),配合fileFormat: 'GeoTIFF'
导出为标准遥感格式,便于后续分析。
五、不同方法的适用场景与选择建议
方法类型 | 核心优势 | 适用场景 |
---|---|---|
原始云掩膜 | 简单快速,标准流程 | 一般云量地区,精度要求不高 |
增强型云掩膜 | 多条件检测,减少漏检 | 多云、多雪地区,高精度需求 |
NDSI雪/云分离 | 区分雪与云,减少误判 | 高纬度、高海拔积雪区域 |
NDVI云掩膜 | 结合植被指数,适应复杂地表 | 植被覆盖区,云与植被混淆场景 |
中值合成去云 | 静态填充,计算效率高 | 地表特征稳定区域(如裸地) |
时间序列插值去云 | 动态适应地表变化,保留时序特征 | 植被、水体等动态地表区域 |
实践建议:先通过maskCloudsEnhanced
进行基础云掩膜,再根据研究区特征(如是否有积雪、植被覆盖度)选择辅助方法(NDSI或NDVI),去云处理优先使用时间序列插值法以保留更多真实地表信息。
部分实验结果如下:
1.整体结果
2.不同云掩膜
3.原始影像与时间序列插值结果
欢迎大家关注我的微信公众号:遥感AI实战,猫猫头像的那个