GEE必须会教程—Landsat影像去云处理(旧)
卫星在拍摄地表的过程中经常受到大气条件的干扰。当卫星飞越研究区域上空时,若云层厚重会导致数据质量与可靠性的严重下降,从而大大增加研究难度。在光学遥感领域,不同影像间的协同处理方法将直接影响后续的数据分析、地物识别以及研究效率的提升。今天就让我们一起探索GEE平台上的去云技术吧
在GEE平台中进行去云的方法主要包括两种:第一种是利用影像数据自带的QA质量波段来进行去云处理;第二种则是通过相关算法对数据实施去云处理。无需多言,在学习 today 的过程中,请跟随我们的脚步继续探索。
一、学习目标
(1)掌握Landsat影像的TOA数据去云方法。
(2)掌握Landsat影像的SR数据去云方法。
二、代码学习
A.TOA数据
TOA(Top of Atmosphere)代表了Landsat大气层顶端反射率测量的核心指标。TOA数据消雾过程可借助Google Earth Engine(GEE)内置的专业消雾算法函数来完成。其核心流程包括首先对获取的数据进行气象条件评估以识别潜在云层影响;随后将这些影响量化评估,并基于预设的标准进行消雾处理。在Google Earth Engine(GEE)平台中,这一消雾算法的具体实现方式如下:
ee.Algorithms.Lansat.simpleCloudScore()
接下来,我们在GEE中看看这个函数的介绍:

当我们遇到这个函数时,首先要关注的是,在参数设置中实现了该算法的前提条件是输入的Image必须为TOA类型。由此可见,该方法专为Landsat系统的TOA数据设计 ,仅适用于此类场景下的应用。进一步解释道该方法完全是针对TOA数据开发的
原理:基于TOA平台获取原始波段数据(未经任何预处理或计算),并基于亮度、温度以及NDSI这三个指标构建一个[0,100]范围内的简单云似然分数(通过加权求和的方式)。随后生成一个新变量命名为cloud,并完成去云校正过程。
算法过程:
确定适合的波段:首先,在Landsat影像数据中确定适合用于云检测的各个波段。常用的选择包括蓝光、绿光、红光以及近红外波段。
波长缩放:对所选的波段进行尺度调整,以确保计算过程中各数据具有统一的数值范围。
③计算云指数:基于不同波段之间的比率或变化量来构建云指数。主要的方法包括NDVI(归一化植被指数)和NDSI(归一化差异雪指数).例如.
云计算掩膜生成技术:基于设定的cloud指数阈值,在遥感影像中将像素按是否属于cloud区域进行分类。通常情况下,具有较高数值的cloud index 通常对应较高的cloud覆盖程度。
除了直接识别外, 还需要对影像中的云边缘进行分析以确定其阴影区域. 通过计算影像中各像素点的对比度和亮度变化特征, 可以生成相应的影阴掩膜.
生成最终的云覆盖图:通过融合" cloud "与" cloud shadow "覆盖图来实现。在这一融合过程中, 可根据具体场景的需求调节这两者之间的权重分配。
来举个例子,先随机在地图上绘制一个研究区域。

编辑希望了解在2020年1月期间该区域内共有多少影像资料,并计划对每一张获取到的影像图像进行去云处理工作。以下将提供相应的代码实现方案。
Map.centerObject(geometry,6);
//影像访问和调用
var collection = ee.ImageCollection("LANDSAT/LC08/C01/T1_TOA").filterDate("2020-01-01","2020-01-31").filterBounds(geometry);
print(collection);
var list = collection.toList(collection.size());
var firstImage = ee.Image(list.get(0));
var secondImage = ee.Image(list.get(1));
var ThirdImage = ee.Image(list.get(2));
print(firstImage,secondImage,ThirdImage);
var visParams = {
bands:["B4","B3","B2"],
min:0,
max:0.3
};
Map.addLayer(firstImage,visParams,"firstImage");
Map.addLayer(secondImage,visParams,"secondImage");
Map.addLayer(ThirdImage,visParams,"ThirdImage");
//定义去云掩膜函数
function CloudMask(image){
var mask = image.select("cloud").lte(30);
return image.updateMask(mask);
}
//调用去云函数和已经定义好的云掩膜函数
var C1 = ee.Algorithms.Landsat.simpleCloudScore(firstImage);
var C1a = CloudMask(C1);
Map.addLayer(C1a,visParams,"C1a");
var C2 = ee.Algorithms.Landsat.simpleCloudScore(secondImage);
var C2a = CloudMask(C1);
Map.addLayer(C2a,visParams,"C2a");
var C3 = ee.Algorithms.Landsat.simpleCloudScore(ThirdImage);
var C3a = CloudMask(C3);
Map.addLayer(C3a,visParams,"C3a");
print(C1a,C2a,C3a)
代码解读
整个去云处理这一过程较为简便。具体流程如下:首先调用所需的TOA影像集合,在本研究中采用Landsat8数据集进行分析。随后使用所需TOA影像集合的时间范围设定为2020年1月,并通过控制台输出结果界面。结果显示共有三幅影像被成功获取。

接下来,在处理流程中小编通过调用toList方法实现了对原始数据集进行转换的操作过程。设计使用size方法的目的在于获取该数据集的具体规模。从而实现了对三张原始图像进行编号的过程。考虑到该数据集内的样本数量较为有限,在后续处理中选择了一一调用而不使用循环结构的方式处理这些图像数据,并完成相应的加载显示操作。

通过观察图像, 我们能够注意到三个影像通道中的云层覆盖面积均较大, 这严重影响了数据的有效利用, 因此必须对其进行去雾处理。在此过程中, CloudMask函数 的主要目标是设定筛选门槛值, 将所有 pixel 的 cloud cover 值超过 30 的区域标记为存在云层, 并对其进行去除操作。值得注意的是, 该算法需与后续采用 TOA(Top of Atmosphere)去云方法获取到的“cloud”波段进行结合使用

通过上述代码,最终实现了数据去云处理:

B.SR数据
地表反射率数据(Surface Reflectance)是Landsat提供的关键地理信息之一。该遥感产品的去云处理主要依靠... QA质量波段的数据特征进行分析与修复工作。具体而言,在前期经验总结的基础上应用了基于按位运算的方法实现了对像素值的有效筛选机制,并最终目的是去除或消除地表覆盖物中的干扰因素以确保遥感图像的质量与准确性。
既然要用到qa质量波段,我们先看看以前的SR数据质量波段信息:
Bit 0 Fill,
Bit 1 Clear,
Bit 2 Water,
Bit 3 Cloud Shadow
Bit 4 Snow
Bit 5 Cloud
Bit 6,7 Cloud Confidence
Bit 8,9 Cirrus Confidence
Bit 10 Terrain Occlusion
在其中,** Bit3 和 Bit5 分别代表云阴影与云存储的信息** ,这将在定义去云函数的第一及第二步骤中的( <<)位操作起到至关重要的作用。 因此,在使用 QA 质量波段计算时 ,我们首先要明确影像数据所具有的 QA 波段信息 。 在此不做深入探讨其逻辑关系 , 并待后续补充关于计算公式的理解内容
与TOA类似,上代码:
//SR影像数据
var collection = ee.ImageCollection("LANDSAT/LC08/C01/T1_SR").
filterDate("2020-01-01","2020-01-31").filterBounds(geometry);
print(collection);
var list = collection.toList(collection.size());
var firstImage = ee.Image(list.get(0));
var secondImage = ee.Image(list.get(1));
var ThirdImage = ee.Image(list.get(2));
print(firstImage,secondImage,ThirdImage);
var visParams = {
bands:["B4","B3","B2"],
min:0,
max:3000
};
Map.addLayer(firstImage,visParams,"firstImage");
Map.addLayer(secondImage,visParams,"secondImage");
Map.addLayer(ThirdImage,visParams,"ThirdImage");
function CloudMask(image){
var CloudShadow = (1<<3);
var Cloud = (1<<5);
var qa = image.select("pixel_qa");
var mask = qa.bitwiseAnd(CloudShadow).eq(0).and(qa.bitwiseAnd(Cloud).eq(0));
return image.updateMask(mask);
}
var S1 = CloudMask(firstImage);
var S2 = CloudMask(secondImage);
var S3 = CloudMask(ThirdImage);
Map.addLayer(S1,visParams,"S1");
Map.addLayer(S2,visParams,"S2");
Map.addLayer(S3,visParams,"S3");
代码解读
前面的代码参照TOA解释,这里我们主要解释定义的去云函数的意思
此段代码的主要目的是阐述bitwiseAnd执行于CloudShadow字段上,并与另一个条件判断相连
该操作是对影子云覆盖区域进行 bitwise AND 运算处理。其中qa表示输入的遥感图像数据(Remote Sensing Image Data),而CloudShadow则代表用于标记阴影云区的掩膜(Shadow Mask)。该运算会对输入图像的每个像素进行逐像素对比分析,并根据二进制值的关系生成新的掩膜图层(Result Mask Layer)。具体而言,在运算过程中:只有当两个像素位置上的二进制位同时为1时(即满足逻辑与条件),结果对应的二进制位才会设置为1;否则(包括其中一个或两个均为0的情况)将被设置为0。
在这一阶段中, 我们通过将上一步骤计算出的结果进行位运算与0进行对比. 其中','.eq().’被定义为等式比较操作符,用于对图像中的每个对应像素执行等式关系判断. 为了筛选出那些经过位运算后结果为零的位置, 从而识别出所有对应位置上的像素值为零的情况.
其中对云执行位运算,并将其结果与其前一步的结果执行逻辑运算。其中cloud变量代表用于表示云覆盖情况的掩码。通过位运算过程,在此基础上能够识别出既不在云区域也不在阴影区域的像素点。
原图像:

去云图像:

为了解决这个问题,请注意我们今天在GEE平台介绍了之前的TOA(地表反射)数据以及SR(散射校正)数据。现在GEE平台已经推出了全新的Landsat( landaster )遥感产品系列。这些新产品的使用方法与之前的去云处理步骤有所不同。希望同学们能够通过今天的分享实践这些方法,并灵活运用到新的Landsat遥感产品上去。
因为小编的能力有限,在处理QA质量波段时的理解深度尚未达到能够输出的要求。等到他深入理解后再次分享。
今天的学习告一段落,谢谢大家!
