作者:_养乐多_

本文介绍了几个 Google Earth Engine (GEE) 平台中常用的处理遥感数据中的缺失值代码片段,这些代码可以用于在时间序列中对遥感图像进行线性插值,提供更加连续和完整的时间序列。

第一段代码是一个线性插值函数,它能够在一个时间序列图像集合中对缺失数据进行插值。该函数使用了 GEE 平台中的图像集合操作函数和图像合成函数,并采用了线性插值方法对缺失值进行处理,最后返回一个插值后的图像集合。(该代码可以应用与去云后通过时间序列数据进行插值填补影像空洞)

第二段代码是一个掩模替换函数,它的作用是将原始影像中的某些值(如缺失值)用一个新值替换。它使用了 GEE 平台中的图像操作函数,并使用掩膜对影像进行处理,最后返回替换后的影像。

第三段代码是一个添加时间属性的函数,它会在影像中添加一个时间波段,用于后续时间序列分析。该函数同样使用了 GEE 平台中的图像操作函数和元数据属性获取函数。

最后一段代码是一个提取质量控制 (QA) 位的函数,它能够从一个多波段图像中提取指定位置的 QA 位数据。它使用了位运算函数和移位函数,并使用了 GEE 平台中的图像操作函数。


目录

一、线性插值函数

二、掩模替换函数

三、添加时间属性的函数

四、提取质量控制 (QA) 位函数


一、线性插值函数

//线性插值填补无云像素
function linearInterp(imgcol, frame, nodata, bandname){frame  = frame  || 32;nodata = nodata || 0;var time   = 'system:time_start';imgcol = imgcol.map(addTimeBand);var maxDiff = ee.Filter.maxDifference(frame * (1000*60*60*24), time, null, time);var cond    = {leftField:time, rightField:time};// 待插影像之前的所有影像// Images before, 按时间升序排序 (最近的是排序后最后一个)var f2 = ee.Filter.and(maxDiff, ee.Filter.greaterThanOrEquals(cond));var c2 = ee.Join.saveAll({matchesKey:'before', ordering:time, ascending:true}).apply(c1, imgcol, f2);// 待插影像之后的所有影像// Images after 按时间降序排列 (最近的是排序后最后一个)var f1 = ee.Filter.and(maxDiff, ee.Filter.lessThanOrEquals(cond));var c1 = ee.Join.saveAll({matchesKey:'after', ordering:time, ascending:false}).apply(imgcol, imgcol, f1);var interpolated = ee.ImageCollection(c2.map(function(img) {img = ee.Image(img);var before = ee.ImageCollection.fromImages(ee.List(img.get('before'))).mosaic();var after  = ee.ImageCollection.fromImages(ee.List(img.get('after'))).mosaic();img = img.set('before', null).set('after', null);//替换空值,确认线性Interp有结果before = replace_mask(before, after, nodata);after  = replace_mask(after , before, nodata);//计算图像的时间之间的比率var x1 = before.select('time').double();var x2 = after.select('time').double();var now = ee.Image.constant(img.date().millis()).double();//待插影像时间减去前面的合成时间,除以后面的合成影像时间和前面的影像时间的差var ratio = now.subtract(x1).divide(x2.subtract(x1));  //x1 = x2时,为零//计算插值图像before = before.select(0); //移除时间波段after  = after.select(0);img    = img.select(0); var interp = after.subtract(before).multiply(ratio).add(before).toFloat();var qc = img.mask().not().rename('qc');interp = replace_mask(img, interp, nodata).rename(bandname);//return interp.addBands(qc).copyProperties(img, img.propertyNames());return interp.copyProperties(img, img.propertyNames());}));return interpolated;
}

这段代码实现了对图像集合进行线性插值,生成时间连续的图像序列,从而对时间序列进行进一步分析和处理。下面是代码的详细介绍:

  1. linearInterp(imgcol, frame, nodata, bandname):该函数接受四个参数,分别为:
  • imgcol:图像集合,即待插值的图像序列。
  • frame:时间窗口,即选择多少天内的图像插值,默认值为32。
  • nodata:缺失值,即需要插值的像素点的默认值,默认值为0。
  • bandname:插值后的波段名称,默认值为原始波段名称。
  1. addTimeBand(img):该函数用于添加时间属性,即为图像添加一个名为“time”的新波段,该波段的值为图像的起始时间。

  2. ee.Filter.maxDifference(frame * (1000*60*60*24), time, null, time):该语句用于生成一个时间过滤器,用于对图像集合进行分组,以便进行插值操作。frame * (1000*60*60*24) 表示时间差异的阈值,单位为毫秒。

  3. ee.Join.saveAll({matchesKey:'after', ordering:time, ascending:false}).apply(imgcol, imgcol, f1):该语句用于将图像集合按照时间降序排序,并为每个图像找到它之后的最近的图像。在该语句中,matchesKey 表示保存关联图像的键值,ordering 表示排序关键字,ascending 表示是否升序排序。

  4. ee.Join.saveAll({matchesKey:'before', ordering:time, ascending:true}).apply(c1, imgcol, f2):该语句用于将图像集合按照时间升序排序,并为每个图像找到它之前的最近的图像。在该语句中,matchesKeyorderingascending 的含义与上述相同。

  5. interpolated:该语句是一个图像集合,其中的每个图像都是通过线性插值生成的新图像。具体来说,对于两个相邻的图像 beforeafter,首先用 replace_mask 函数替换缺失值,并计算出它们之间的时间比率,然后根据时间比率,通过线性插值生成一张新图像 interp。最后,将新图像的波段名称重命名为 bandname,并复制原始图像的属性。

综上所述,该代码实现了对图像序列进行线性插值,并返回一系列时间连续的图像序列,为后续的时间序列分析提供了重要的基础。

二、掩模替换函数

//掩模替换
function replace_mask(img, newimg, nodata) {nodata   = nodata || 0;var mask = img.mask();img = img.unmask(nodata);img = img.where(mask.not(), newimg);img = img.updateMask(img.neq(nodata));return img;
}

这段代码实现的是掩模替换的功能。该函数的输入参数包括一个原始图像img、一个用于替换无效数据的新图像newimg和一个可选的无效数据值nodata。输出为经过掩模替换后的图像。

  • 函数中的第一行nodata = nodata || 0表示如果未传入无效数据值nodata,则默认值为0。
  • 接下来,该函数通过img.mask()获取了原始图像的掩模(mask),然后通过img.unmask(nodata)将原始图像的无效数据(即值等于nodata的像素)转换为NaN,以便后续处理。
  • 然后,函数调用img.where(mask.not(), newimg),该函数会将掩模中值为false的像素替换为新图像newimg中对应像素的值。这个操作就是所谓的掩模替换。
  • 最后,函数调用img.updateMask(img.neq(nodata)),该函数会将原始图像中值不等于nodata的像素重新赋上掩模,即原始图像中的有效数据区域。

最终函数返回经过掩模替换和更新掩模后的图像。

三、添加时间属性的函数

//添加时间属性
function addTimeBand(img) {/** 确保掩模一致 */var mask = img.mask();var time = img.metadata('system:time_start').rename("time").mask(mask);return img.addBands(time);
}

这段代码实现的是为图像添加时间属性的功能。该函数的输入参数为一个图像img,输出为添加时间属性后的图像。

  • 函数中的第一步操作是获取图像的掩模,以确保添加的时间属性的掩模和原始图像一致。具体而言,函数通过img.mask()获取了原始图像的掩模(mask)。
  • 接下来,函数通过img.metadata('system:time_start')获取原始图像的起始时间,即该图像的时间属性。获取的时间属性被重命名为time,然后通过.mask(mask)将其掩模与原始图像的掩模一致。这样就保证了时间属性的掩模和原始图像的掩模一致。
  • 最后,函数通过img.addBands(time)将时间属性作为一维带(band)添加到原始图像中,从而得到了一个带有时间属性的新图像。

这个函数通常在处理遥感影像时使用,由于遥感影像一般都包含时间属性,因此为遥感影像添加时间属性可以更好地进行时间序列分析,例如通过时间属性对影像进行分类、监测变化等。

四、提取质量控制 (QA) 位函数

//返回提取的QA位的单波段图像
var getQABits = function(image, start, end) {var pattern = 0;for (var i = start; i <= end; i++) {pattern += 1 << i;}return image.bitwiseAnd(pattern).rightShift(start);
};

这段代码实现的是从多波段图像中提取QA(Quality Assurance)位的单波段图像的功能。该函数的输入参数包括一个多波段图像image,一个表示QA位的起始位置start,和一个表示QA位的终止位置end。输出为提取出来的QA位的单波段图像。

函数中的核心操作是通过位运算提取QA位。

  • 首先,函数定义了一个变量pattern,并将其初始化为0。然后,函数通过循环遍历从startend的所有位数,将每个位的二进制表示中的1向左移动相应的位数,最后将它们相加,得到一个表示QA位的二进制模式。具体而言,这个过程就是将一个二进制的"1"左移若干位(位数由i决定),然后与变量pattern相加。
  • 接下来,函数通过image.bitwiseAnd(pattern)将二进制模式应用到输入的多波段图像image上,得到一个新的多波段图像,其中仅保留了QA位上的像素值。
  • 最后,函数通过.rightShift(start)将提取出来的QA位向右移动start位,得到一个单波段图像,即为提取出来的QA位的单波段图像。

该函数通常在遥感影像处理中使用,例如对Landsat影像的QA信息进行处理,以确定哪些像素是有用的(如云、阴影、水等)并排除掉无用的像素。

GEE:应用遥感影像时空插值技术的实践(插值填补去云空洞)相关推荐

  1. 《云GIS技术与实践》第一章 云GIS技术综述 笔记

    1.1 概述 1.2 GIS面临的挑战 1.3 云GIS技术的基本特征 1.4 云GIS的服务模式与部署方式 1.5 云GIS技术价值 1.6 本章小结 >>1.1 概述 近年来,互联网. ...

  2. GEE中遥感影像反演水深遇到的一些问题

    GEE界面生成洪水深度范围过大,不仅仅是淹没范围,还包含阴影部分 解决:导入洪水淹没范围时,将0值的背景进行掩膜操作 GEE影像导出到arcgis出现多余背景问题 解决:对于GEE中经过updateM ...

  3. 《云GIS技术与实践》第二章 云GIS核心技术 笔记

    2.1 概述 2.2 分布式系统架构 2.3 Web开发技术模式 2.4 消息队列技术 2.5 虚拟化技术 2.6 分布式存储技术 2.7 高性能跨平台GIS技术 2.8 多层次智能集群技术 2.9 ...

  4. GEE系列:​第3单元 栅格遥感影像波段特征及渲染可视化

    GEE从入门到实战的10个系列单元: GEE系列:第1单元 Google地球引擎简介 GEE系列:第2单元 探索数据集 GEE系列:​第3单元 栅格遥感影像波段特征及渲染可视化 GEE系列:第4单元 ...

  5. 遥感技术及高分遥感影像在地震中的应用

    长期以来,地震预报监测.灾害调查.灾情信息获取主要依靠实地勘测手段,其获取的数据精度和置信度虽然较高,但存在工作量大.效率低.费用高和信息不直观等缺点.遥感技术手段可在一定程度上克服传统实地勘测手段的 ...

  6. 遥感技术及高分遥感影像在地震中的应用及高分二号获取

    长期以来,地震预报监测.灾害调查.灾情信息获取主要依靠实地勘测手段,其获取的数据精度和置信度虽然较高,但存在工作量大.效率低.费用高和信息不直观等缺点.遥感技术手段可在一定程度上克服传统实地勘测手段的 ...

  7. 2021遥感应用组二等奖:基于长时序Landsat遥感影像的赣南脐橙时空变化分析

    作品介绍 一.应用背景 自上世纪70年代开始种植脐橙以来,赣州大力实施"兴果富农"等战略,经过38年发展产业规模迅速壮大,目前赣州全市果业总面积263万亩,脐橙158万亩,产量超1 ...

  8. GEE:变异系数法在遥感影像分析中的应用及权重计算

    作者:CSDN @ _养乐多_ 本文介绍了在Google Earth Engine(GEE)平台上基于变异系数法的多指标加权遥感影像分析方法.该方法通过计算每个指标的平均值和标准差,进而计算变异系数来 ...

  9. 基于Google Earth Engine Explorer谷歌地球引擎GEE浏览界面实现遥感影像地物监督分类

      本文主要对GEE的网页界面式应用程序接口Google Earth Engine Explorer加以详细介绍与地物监督分类这一具体应用.本文是谷歌地球引擎(Google Earth Engine, ...

最新文章

  1. 【Linux基础】作业二
  2. [HTML]增加input标签的multiple属性上传的文件数
  3. Spring Aop----用idea实现面向切面编程
  4. Xtreme ToolkitPro 初使用
  5. DLL和COM的发展过程
  6. 千兆交换机下面可以接多少层交换机_高清监控怎么选配交换机
  7. 写笔记插件_如何构建自己的笔记知识体系?
  8. C语言链表与malloc函数
  9. java内功 ---- jvm虚拟机原理总结,侧重于虚拟机类加载执行系统
  10. Android之常见UI控件
  11. 能上QQ但不能打开网页——解决办法
  12. 关于总线、现场总线、RS-485和modbus之间的关系
  13. pytorch学习笔记九:权值初始化
  14. linux中su 与su-的区别
  15. 关于C语言函数的简单理解
  16. 灵猫二维码 - 二维码中间加图片的方法
  17. 嵌入式简答题知识点总结
  18. C语言基础指针知识点总结
  19. 阿里云ecs云服务器建立wordpress个人博客教程
  20. 【学习笔记】proxy的用法

热门文章

  1. 洛谷-P3799 妖梦拼木棒
  2. 计算机主板的风扇控制,DELL电脑在BIOS里头怎么调CPU风扇转速?
  3. VC-dimension
  4. 【软件相关】Proteus仿真STM32记录
  5. 如何用python执行macro_python与macro宏调用
  6. 全志V3S嵌入式驱动开发(开发软件搭建)
  7. 洛谷 P4147 玉蟾宫 题解【悬线dp】
  8. 基于ssm的拍卖系统
  9. 【简书读书社】每个周末,一起来读简书电子书(第三期)
  10. WordPress自定义小工具