GEE(Google earth engine)中的Landsat影像的选择和去云(附代码)

本文分享了获取校正过的Landsat影像及去云的方法。获取影像时推荐使用地表反射率数据,同时指出不同Landsat型号代码有差别、Landsat5数据时间的注意点。去云方面,介绍了函数去云和用median()两种方式,并给出提高精度和去云效果的建议,还分享了debug方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1.获取校正过的Landsat 影像

        在这里可以看到GEE提供的全部Landsat数据:Landsat Collections in Earth Engine  |  Earth Engine Data Catalog  |  Google Developers

     

        随便点进去,比如Landsat8,有三个数据,一个是地表面反射率数据,一个是大气层顶部的反射率数据,一个是raw。大气层顶部的反射数据需要进行大气校正才可以得到地表反照率。而raw数据自带了一个simplecomposite函数可以一步实现大气校正+去云(但亲测效果真的很靠运气,而且不是很好)。所以我推荐直接用地表反射率数据,不必为难自己去做校正,自己去云小问题。

        这里有个坑,地表反射率数据每一个波段都是空的!!!!!所以看到显示影像全是白色的时候不要害怕,本来就是这样的。请按照GEE的官方代码,自行套用,这个是Landsat8复制过来的代码:

var dataset = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')
    .filterDate('2021-05-01', '2021-06-01');

// Applies scaling factors.
function applyScaleFactors(image) {
  var opticalBands = image.select('SR_B.').multiply(0.0000275).add(-0.2);
  var thermalBands = image.select('ST_B.*').multiply(0.00341802).add(149.0);
  return image.addBands(opticalBands, null, true)
              .addBands(thermalBands, null, true);
}

dataset = dataset.map(applyScaleFactors);

var visualization = {
  bands: ['SR_B4', 'SR_B3', 'SR_B2'],
  min: 0.0,
  max: 0.3,
};

Map.setCenter(-114.2579, 38.9275, 8);

Map.addLayer(dataset, visualization, 'True Color (432)');

        上面那个代码是在Terms of use 上面找的。注意!不同的Landsat型号的上面那个代码是有细微差别的!不可以用同一个代码(自己曾经栽坑)!

        这里还有一个坑,Landsat5数据在1986后半年才有数据!虽然是1984才发射的!这里极易报错(如果不注意的话)。

        数据搞到了,现在开始去云。

2.去云

        很多代码直接无脑median()是很有问题的!有一些代码去云还是用mean(),这个更有问题!我下面的方法不一定是最方便的,但是应该是效果最好的。先说两种去云的方式:

(1)使用函数去云。

        这是我在csdn经常看到的。怎么说呢......还是看运气。有时候去了和没去一个样,有时候也works.因为相关的文章很多,这里就不贴具体的博文了。

(2)用median()。

        这个也是用得很多的。其实原理很直接明了,云的反射率很高,没有云的反射率就比较低,你先用cloud cover筛一遍,再用median也不错。但注意!一定要多多尝试cloud cover的阈值!不然很有可能你得到的结果精度不高,或者存在有些地方云还是没去掉。

        我先说为什么可能得到的精度不高。某一个pixel,如果有好几张相片都拍到,如果你监测城市用地的变化,那如果你这个pixel用的是年初的,另外旁边一个Pixel用的是年末的,那么你这一块城市用地到底是什么个情况很难说。所以对于这种应用场景,建议你设置一个时间的range,挑冬天没什么云的时候来搞。如果你想看农用地,那么一年得多大变化啊,所以更应该设置时间range。至于云为什么去不掉就不用多说了,假设你这一块有云的影像超过了半数,那就去不掉。所以建议先一点一点提高cloud cover的阈值,直到他刚好能覆盖完整研究区。

        上面这些经验真的我试了好几天!血泪教训!

        代码贴出来(你看这个2的阈值肯定就是一点一点去试出来的,同时设置了一下时间):

// Applies scaling factors for landsat 8.
function applyScaleFactors8(image) {
  var opticalBands = image.select('SR_B.').multiply(0.0000275).add(-0.2);
  var thermalBands = image.select('ST_B.*').multiply(0.00341802).add(149.0);
  return image.addBands(opticalBands, null, true)
              .addBands(thermalBands, null, true);
}

var landsat8 = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')
    .filterBounds(roi)
    .filterDate('2022-04-01', '2022-12-30')
    .map(applyScaleFactors8)
    .filter(ee.Filter.lt('CLOUD_COVER',2))
    .median();

        我师姐和我说,最好不要像这样一句代码写这么长,这样debug的时候就比较费劲(不管了)。可以这样去debug,你复制https://code.earthengine.google.com/这个网址,打开一个新的网页粘贴上去,就开了一个新窗口,然后就可以快乐debug目标代码啦~代码里面的filter就不解释了,总之就是用3个filter去限制时间和空间和云量。

        以上就是Landsat数据导入的全部内容啦~下次的内容是怎么做城市不透水面提取的年度变化!成果是下面这样:

### 如何在 GEE 中对 Sentinel 卫星影像进行处理 #### 使用 Sentinel-3 数据的方法 对于 Sentinel-3 的 OLCI (Ocean and Land Color Instrument) 数据,可以采用特定算法来减少的影响。OLCI 提供全分辨率地球观测图像,在这些图像中识别并移除层是一个复杂的过程[^1]。 为了实现这一目标,通常会应用基于光谱特性的阈值法或其他高级技术如机器学习模型来进行区分。具体来说: - **光谱指数计算**:通过构建不同的植被、水体等特征指数可以帮助更精确地区分地面覆盖物与。 - **时间序列分析**:如果有多时相的数据,则可以通过比较同一地点不同时刻的状态变化情况辅助判断哪些像素被遮挡。 然而值得注意的是,上述提到的方法主要适用于具有较高空间分辨能力的传感器所获取的数据集;而对于 Sentinel-3 这样主要用于海洋陆地颜色监测的任务而言,其设计初衷并非针对高精度的地表细节成像,因此实际操作过程中可能需要调整策略以适应较低的空间分辨率特性。 ```javascript // JavaScript 示例代码片段用于说明概念而非直接执行 var sentinel3Collection = ee.ImageCollection('COPERNICUS/S3/OLCI') .filterDate('2023-01-01', '2023-12-31'); function maskClouds(image){ var cloudBitMask = ee.Number(2).pow(7).int(); // 假设第8位表示掩膜 var qaBand = image.select('quality_flags'); var mask = qaBand.bitwiseAnd(cloudBitMask).eq(0); return image.updateMask(mask); } var maskedImages = sentinel3Collection.map(maskClouds); ``` #### 利用 Sentinel-2 数据实施更为精细的方案 当涉及到更高分辨率的 Sentinel-2 MSI (MultiSpectral Instrument) 图像时,存在更加成熟完善的解决方案可供选择。这里介绍一种常见的做法——即结合 SCL(Scene Classification Map)波段信息完成自动化程度较高的流程[^2]。 这种方法不仅能够有效消除及其阴影影响,还能同步解决积雪干扰等问题。下面给出一段简化版的操作指南作为参考: ```javascript // 加载哨兵二号数据集合 var s2 = ee.ImageCollection("COPERNICUS/S2_SR"); // 定义过滤条件筛选所需时间段内的可用场景 var filtered = s2.filterBounds(geometry) .filterDate(startDate, endDate); // 应用预定义函数除不需要的部分(如) var cloudyPixelBitMask = ee.Number(2).pow(10).int(); var clearPixelsOnly = function(img){ var qa = img.select('QA60'); var mask = qa.bitwiseAnd(cloudyPixelBitMask).eq(0); return img.updateMask(mask); }; filtered = filtered.map(clearPixelsOnly); ```
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值