I would like to reclass MODIS imagery using GEE. The aim is to reclass an image (i) using the day before (index i-1) and the day after (i+1), and then (i-2 and i+2). I’ve tried with .expression and .where, but I can’t be able to solve the issue. My imagery has 3 values ( 1, 2 and 3), so I need to reclass 1 looking through the consecutive images.
Here, my reproducible script:
var ROI= ee.Geometry.Polygon(
[[[-121.96115141166754, 50.173193895476736],
[-121.96115141166754, 45.64072456168797],
[-117.63253813041754, 45.64072456168797],
[-117.63253813041754, 50.173193895476736]]], null, false);
var reclassify = function(image) {
var b0 = image.select('NDSI_Snow_Cover')
var b1 = image.select('Snow_Albedo_Daily_Tile_Class')
var shift0 = b0.where(b0.gt(40), 3).where(b0.lte(40), 2).unmask(-9999);
var shift1 = b1.remap(
[101, 111, 125, 137, 139, 150, 151, 250, 251, 252, 253, 254],
[ 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1 ], null);
var reclassified = shift0.where(shift0.eq(-9999).and(shift1.eq(2)),2).where(shift0.eq(-9999).and(shift1.eq(1)),1).rename('remapped')
return reclassified
};
var terraCollection = ee.ImageCollection('MODIS/061/MOD10A1').filterBounds(ROI)
.sort('system:time_start', true).filterDate('2016-04-01', '2017-05-01').map(reclassify)
print(terraCollection)
var list0 = terraCollection.toList(terraCollection.size());
var collectionSize = terraCollection.size().getInfo();
var temporalFilter = ee.List([]);
for (var i = 3; i <= collectionSize-1; ++i){
var b0 = ee.Image(list0.get(i-0)).select('remapped');
var b1 = ee.Image(list0.get(i-1)).select('remapped');
var b2 = ee.Image(list0.get(i+1)).select('remapped');
var b3 = ee.Image(list0.get(i-2)).select('remapped');
var b4 = ee.Image(list0.get(i+2)).select('remapped');
var shift0 = b0;
var shift1 = shift0.expression( '(b0 == 1) && (b1 == 3) && (b2 ==3) ? 3 : b0', {'b0': shift0, 'b1': b1, 'b2': b2});
var shift2 = shift1.expression( '(b0 == 1) && (b1 == 2) && (b2 ==2) ? 2 : b0', {'b0': shift1, 'b1': b1, 'b2': b2});
var shift3 = shift2.expression( '(b0 == 1) && (b3 == 3) && (b4 ==3) ? 3 : b0', {'b0': shift2, 'b3': b1, 'b4': b2});
var shift4 = shift3.expression( '(b0 == 1) && (b3 == 2) && (b4 ==2) ? 2 : b0', {'b0': shift3, 'b3': b1, 'b4': b2});
temporalFilter = temporalFilter.add(shift1.rename('remapped').copyProperties(b0, ['system:index','system:time_start']));
}
var temporalCollection = ee.ImageCollection.fromImages(temporalFilter)
print(temporalCollection)
var list1 = temporalCollection.toList(temporalCollection.size());
var k = '01';
var dateFilter = '2016_04_' + k;
var img0 = list0.filter(ee.Filter.eq('system:index', dateFilter)).get(0);
var img1 = list1.filter(ee.Filter.eq('system:index', dateFilter + '_' + dateFilter)).get(0);
var imgsnow0 = ee.Image(img0).reproject('EPSG:32719', null, 500);
var imgsnow1 = ee.Image(img1).reproject('EPSG:32719', null, 500);
Map.addLayer(imgsnow0.clip(ROI), {min:1,max:3, palette: ['4de0e0','3d4852','ffffff']}, 'MODIS Terra',true);
Map.addLayer(imgsnow1.clip(ROI), {min:1,max:3, palette: ['4de0e0','3d4852','ffffff']}, 'MODIS Filter',true);