GEE必须会教程—Landsat影像去云处理(旧)

卫星在拍摄地表的过程中,常常会受到大气条件的干扰。当卫星经过研究区域上空时,倘若云层密布,这将严重影响数据的质量和可靠性,加大研究的难度。在光学遥感中,如何对多种影像进行数据处理,将对后续的数据分析、地物识别,提高研究效率产生影响。今天,我们来看看在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质量波段的理解程度没有达到可以输出的程度,后续等小编深入理解再予以分享。

今天的学习告一段落,谢谢大家!

  • 40
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值