从图像集合中提取像素值以在Google Earth Engine中进行合成

时间:2018-09-27 00:13:17

标签: image-processing google-earth-engine landsat

我正在尝试使用Google Earth Engine在一片云密布的地区(印尼的云雾林)中制作无云的Landat复合图像。以前,我是通过制作最绿色的像素合成来成功完成此操作的,其中我使用了具有最高NDVI值的像素,以确保在合成图像中使用的是非云像素。

//Filter landsat 8 image collection by date, area
var collection = landsat
.filterBounds(bounds)
.filterDate(2016-08-01, 2016-10-31);

// Sort from least to most cloudy and get first (least cloudy) image
var sorted = collection.sort('CLOUD_COVER');
var image = ee.Image(sorted.first());

//Function to get NDVI 
var addNDVI = function(image) {
var ndvi = image.normalizedDifference(['B5', 'B4']).rename('NDVI');
return image.addBands(ndvi);
};

//Add NDVI bands to image collection
var withNDVI = landsat.map(addNDVI);

// Make a "greenest" pixel composite using NDVI
var greenest = withNDVI.qualityMosaic('NDVI');
Map.addLayer(greenest, {bands: ['B4', 'B3', 'B2'], max: 0.15}, 'greenest');

代码工作正常,但是,我担心使用最高NDVI像素来使我的合成图像过度代表林区。因此,我正在寻找一种方法来提取具有最高NDVI的像素(以摆脱云),然后在我的复合图像中使用该像素的所有其他7个波段(而不是使用NDVI波段本身)。我的问题是:这是否可以消除森林过剩的代表权,还是我会遇到同样的问题?其次,如果此方法看起来像是在制作不会过度代表森林的合成图像时去除云层的合法方法,那么我该如何提取高NDVI的像素,然后使用其其他波段进行合成? >

1 个答案:

答案 0 :(得分:0)

但是,似乎您用最绿色的像素进行了高质量的镶嵌,它几乎总是会加重热带地区的森林(因为森林确实是绿色的)。我建议您使用Landsat简单云评分算法来查找最不可能混浊的像素,然后根据该像素进行合成。这是一些代码,为您提供了两种制作复合内容的选择。一种基于掩盖浑浊像素并取中值,另一种基于qualityMosaic()函数,同时使用云带的可能性。

var bounds = /* color: #d63000 */ee.Geometry.Polygon(
    [[[94.93602603806119, -12.072520735360198],
      [141.8696197880612, -13.187431968041206],
      [142.3969635380612, 6.019400576838261],
      [94.67235416306119, 6.456250813337956]]]),
    landsat = ee.ImageCollection("LANDSAT/LC08/C01/T1_RT_TOA");

//Filter landsat 8 image collection by date, area
var collection = landsat
 .filterBounds(bounds)
 .filterDate('2016-08-01', '2016-10-31');

//Function to get Inverse Cloud Score
var addCloud = function(image) {
var cloudImg = ee.Algorithms.Landsat.simpleCloudScore(image);
var clouds = cloudImg.select('cloud');
var inverseClouds = ee.Image(100).subtract(clouds).rename('inverse_cloud');
return image.addBands(inverseClouds);
};

//Add cloud bands to image collection
var withCloudBand = landsat.map(addCloud);

// Option 1: Median composite after masking clouds
var noCloudsMedian = withCloudBand.map(function(img){
  return img.updateMask(img.select('inverse_cloud').gt(90));
}).median();
Map.addLayer(noCloudsMedian, {bands: ['B4', 'B3', 'B2'], max: 0.30}, 'Option 1');

// Option 2: Quality mosaic based on least cloudy pixel
var noCloudQualityMosaic = withCloudBand.qualityMosaic('inverse_cloud');
Map.addLayer(noCloudQualityMosaic, {bands: ['B4', 'B3', 'B2'], max: 0.30}, 'Option 2');

以下是查看结果的代码链接:https://code.earthengine.google.com/7ea8e59b5c72340c6d784d850db856f4