If you want to stretch based on statistics for a fixed region, you can use the following approach, which demonstrates both percentage and standard deviation based stretches.
// Function for displaying stretched image based on standard devitations from the mean. var AddLayerStdDevStretch = function(img, sampling_geom, num_stddev) { var stats = img.select(['elevation'],['value']).reduceRegion({ reducer: ee.Reducer.mean().combine({reducer2:ee.Reducer.stdDev(), sharedInputs:true}) .setOutputs(['mean', 'stddev']), geometry: sampling_geom, scale: 30, bestEffort: true }); var vis_params = ee.Dictionary({ 'min': ee.Number(stats.get('value_mean')) .subtract(ee.Number(num_stddev).multiply(ee.Number(stats.get('value_stddev')))), 'max': ee.Number(stats.get('value_mean')) .add(ee.Number(num_stddev).multiply(ee.Number(stats.get('value_stddev')))), }); Map.addLayer({ eeObject: img, visParams: vis_params.getInfo(), name: num_stddev + ' sigma' }); }; // Function for displaying stretched image based on percentile values. var AddLayerPercentStretch = function(img, sampling_geom, percent) { var lower_percentile = ee.Number(100).subtract(percent).divide(2); var upper_percentile = ee.Number(100).subtract(lower_percentile); var stats = img.select(['elevation'],['value']).reduceRegion({ reducer: ee.Reducer.percentile({percentiles: [lower_percentile, upper_percentile]}).setOutputs(['lower', 'upper']), geometry: sampling_geom, scale: 30, bestEffort: true }); var vis_params = ee.Dictionary({ 'min': ee.Number(stats.get('value_lower')), 'max': ee.Number(stats.get('value_upper')) }); Map.addLayer({ eeObject: img, visParams: vis_params.getInfo(), name: percent + '%' }); }; // Sample use - add layers with various stretches to the map. var image = ee.Image("USGS/SRTMGL1_003"); var geometry = ee.Geometry.Polygon( [[[-112.6, 36.3], [-112.6, 35.9], [-111.9, 35.9], [-111.9, 36.3]]]); Map.centerObject(geometry); AddLayerStdDevStretch(image, geometry, 1); AddLayerStdDevStretch(image, geometry, 2); AddLayerStdDevStretch(image, geometry, 3); AddLayerPercentStretch(image, geometry, 90); AddLayerPercentStretch(image, geometry, 98); AddLayerPercentStretch(image, geometry, 100); Map.addLayer(geometry, {}, 'geometry used for stretch statistics');
Note that the percentage based stretches are based on a histogram (see ee.Reducer.percentile), so the 100% stretch may not exactly match the extreme values within the sampling region.