我正试着在有很多云的地区(印尼云林)的谷歌地球引擎中制作一个无云的陆地卫星合成图。以前,我成功地实现了这一点,方法是制作一个最绿色的像素合成,其中我使用具有最高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的像素,然后使用它们的其他波段来制作合成图像?
发布于 2018-11-03 00:49:21
似乎无论你用最绿色的像素做一个高质量的马赛克,它几乎总是会突出热带地区的森林(因为森林是真正的绿色)。我建议您使用Landsat score算法来查找最不可能多云的像素,然后基于此进行合成。下面是一些代码,它们为您提供了两个选项来生成一个复合对象。一种是基于遮蔽多云像素并取中值的方法,另一种是基于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
https://stackoverflow.com/questions/52527645
复制相似问题