卫星在拍摄地表的过程中,常常会受到大气条件的干扰。当卫星经过研究区域上空时,倘若云层密布,这将严重影响数据的质量和可靠性,加大研究的难度。在光学遥感中,如何对多种影像进行数据处理,将对后续的数据分析、地物识别,提高研究效率产生影响。今天,我们来看看在GEE平台上如何进行去云处理。
GEE上的去云方法主要是两种,一种就是借助影像数据自带的QA质量波段去云,另外一种就是运用相关的算法,对数据进行去云处理。话不多说,跟着小编,一起走进今天的学习。
一、学习目标
(1)掌握Landsat影像的TOA数据去云方法。
(2)掌握Landsat影像的SR数据去云方法。
二、代码学习
A.TOA数据
TOA(Top of Atmosphere)是Landsat的大气层顶的反射率产品。TOA数据的去云可以通过GEE中定义的去云算法函数来实现。它的基本逻辑是先监测数据的云结果,对云结果进行量化打分后再根据要求进行去云处理。在GEE中,实现这个算法的函数:
ee.Algorithms.Lansat.simpleCloudScore()
接下来,我们在GEE中看看这个函数的介绍:
看到这个函数,首先我们需要注意的是,在参数中,实现该算法要求输入的Image是TOA Image,因此,这个方法只适合于Landsat的TOA产品,也就是说这个方法是为TOA产品量身定制的,其他数据产品无法套用该产品。
原理:通过传入TOA的原始波段数据(前期未进行任何计算),使用亮度、温度和 NDSI 的组合计算 [0,100] 范围内的简单云似然分数(权重相加),创立一个新的波段“cloud”,进行去云处理。
算法过程:
①选择合适的波段:首先,从Landsat影像中选择合适的波段用于云检测。通常选择蓝光波段、绿光波段、红光波段和近红外波段。
②波段缩放:对选择的波段进行缩放,以便在计算过程中保持一致的数值范围。
③计算云指数:通过计算不同波段之间的比值或差异来构建云指数。常见的云指数计算方法包括NDVI(归一化植被指数)和NDSI(归一化差异雪指数)等。、
④云掩膜生成:根据云指数的阈值,将影像中的像素分为云和非云两类。通常,高云指数值表示云覆盖度高,低云指数值表示云覆盖度低。
⑤云阴影掩膜生成:除了云之外,还需要检测云的阴影。通过计算影像中的阴影指数,可以生成云阴影掩膜。
⑥最终云掩膜生成:将云和云阴影掩膜合并,得到最终的云掩膜。在合并过程中,可以根据实际需求对云和云阴影的权重进行调整。
来举个例子,先随机在地图上绘制一个研究区域。
小编想看看研究区域内在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数据,时间范围是2020年1月份,通过在控制台打印,发现一共有三张影像。
接着,小编采用toList方法,将影像集合转化为列表,使用size方法的目的是获取影像集合的大小。通过这样的操作,便能够将三张影像编号,以便后续我们调用集合中的任意一张影像。因为集合内影像数量不多,小编没有采用循环的方法,而是一张一张调用,并进行影像的加载显示。
从图中我们可以看出,三张影像云层覆盖的范围都比较广,极大影响数据的利用,需要进行去云处理。接着,定义一个CloudMask函数,目的是确定筛选阈值,将像素点云覆盖分数大于30的视为有云,进行去除。该函数需要配合后续的TOA去云方法得到的“cloud”波段。
通过上述代码,最终实现了数据去云处理:
B.SR数据
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解释,这里我们主要解释定义的去云函数的意思
下面是对代码qa.bitwiseAnd(CloudShadow).eq(0).and(qa.bitwiseAnd(Cloud).eq(0))的理解:
①qa.bitwiseAnd(CloudShadow):这一部分是对影子云进行位与操作。qa代表输入的遥感图像数据,CloudShadow代表影子云掩膜。位与操作会将两个图像的对应像素进行逐位比较,如果两个像素的对应位都为1,则结果对应位为1,否则为0。
②.eq(0)这一部分是将上一步的位与结果与0进行比较。.eq()是等于操作符,用于比较两个图像的对应像素是否相等。这里将位与结果与0进行比较,目的是找出位与结果中值为0的像素。
③.and(qa.bitwiseAnd(Cloud).eq(0))一部分是对云进行位与操作,并将结果与上一步的结果进行逻辑与操作,cloud代表云掩膜。通过位与操作,可以找出云和影子云都为0的像素,即去除了云和影子云的部分。
原图像:
去云图像:
需要注意的是今天分享的GEE平台上此前的TOA数据和SR数据,目前GEE已经上线了全新的Landsat数据,调用方式和去云方法略有差别,各位同学可以尝试运用今天的方法,举一反三,看看新的数据如何去云。
由于小编能力有限,关于QA质量波段的理解程度没有达到可以输出的程度,后续等小编深入理解再予以分享。
今天的学习告一段落,谢谢大家!