How can I apply a cloud mask to each individual image in a collection THEN mosaic them together based on (for example) mean pixel value across images? The code does not work because the maskClouds
function requires the input to be a single image but I do NOT want to mosaic all images before all cloud pixels have been removed.
//CDI AOI
var region = ee.FeatureCollection('ft:1tdSwUL7MVpOauSgRzqVTOwdfy17KDbw-1d9omPw')
.filterMetadata('Country', 'equals', 'Ghana');
var landsat8 = ee.ImageCollection('LANDSAT/LC08/C01/T1_SR')
.filterDate('2013-01-01', '2013-12-31')
//.filterMetadata('CLOUD_COVER', 'less_than', 25)
.filterBounds(region);
////////////////////////////////////////////////////////////
/////////////////Start Function/////////////////////////////
////////////////////////////////////////////////////////////
// Fmask classification values var FMASK_CLEAR_GROUND = 0; var FMASK_WATER = 2;
//var FMASK_CLOUD_SHADOW = 3; var FMASK_SNOW = 4; var FMASK_CLOUD = 5;
var getQABits = function(image, start, end, newName) {
// Compute the bits we need to extract.
var pattern = 0;
for (var i = start; i <= end; i++) {
pattern += Math.pow(2, i);
}
// Return a single band image of the extracted QA bits, giving the band
// a new name.
return image.select([0], [newName])
.bitwiseAnd(pattern)
.rightShift(start);
};
// A function to mask out cloudy pixels.
var cloud_shadows = function(image) {
// Select the QA band.
var QA = image.select(['pixel_qa']);
// Get the internal_cloud_algorithm_flag bit.
return getQABits(QA, 3,3, 'Cloud_shadows').eq(0);
// Return an image masking out cloudy areas.
};
// Second function to mask out cloudy pixels.
var cloud_shadows_mean = function(image) {
// Select the QA band.
var QA_mean = image.select(['pixel_qa_mean']);
// Get the internal_cloud_algorithm_flag bit.
return getQABits(QA_mean, 3,3, 'Cloud_shadows_mean').eq(0);
// Return an image masking out cloudy areas.
};
// A function to mask out cloudy pixels.
var clouds = function(image) {
// Select the QA band.
var QA = image.select(['pixel_qa']);
// Get the internal_cloud_algorithm_flag bit.
return getQABits(QA, 5,5, 'Cloud').eq(0);
// Return an image masking out cloudy areas.
};
// Second function to mask out cloudy pixels.
var clouds_mean = function(image) {
// Select the QA band.
var QA_mean = image.select(['pixel_qa_mean']);
// Get the internal_cloud_algorithm_flag bit.
return getQABits(QA_mean, 5,5, 'Cloud_mean').eq(0);
// Return an image masking out cloudy areas.
};
var maskClouds = function(image) {
var cs = cloud_shadows(image);
var c = clouds(image);
image = image.updateMask(cs);
return image.updateMask(c);
};
var maskClouds_mean = function(image) {
var cs_mean = cloud_shadows_mean(image);
var c_mean = clouds_mean(image);
image = image.updateMask(cs_mean);
return image.updateMask(c_mean);
};
////////////////////////////////////////////////////////////
/////////////////End Function///////////////////////////////
////////////////////////////////////////////////////////////
var visParams = {
bands: ['B4', 'B3', 'B2'],
min: 0,
max: 3000,
gamma: 1.4,
};
var landsat8_mask = maskClouds(landsat8)
var cloud_free_mean = landsat8
.reduce(ee.Reducer.mean());
Map.addLayer(cloud_free_mean, visParams2, 'Cloud Free Mean');