Google Earth Engine端元分解导出影像全黑值为0问题求助
光谱端元亚像元占比估算导出影像全黑问题排查与解决
问题描述
尝试使用Google Earth Engine代码进行光谱端元亚像元占比估算,但导出的影像在ArcMap中显示全黑且像素值为0,代码如下:
// The purpose of this script is to estimate sub-pixel fractions // of identifiable spectral "endmembers". This involves finding // "pure" areas to estimate the endmembers, some matrix algebra // followed by the mapping of the fractional cover. // Use the reflective bands. var bands = ['B2', 'B3', 'B4', 'B5', 'B6', 'B7']; // First, let's find a cloud free scene in our area of interest. // Make a point using the geometry tools and name the import 'point'. // Import Landsat 8 TOA data and name the collection 'l8'. var image = ee.Image(l8 .filterBounds(point) .filterMetadata('CLOUD_COVER','less_than', 2) .filter(ee.Filter.calendarRange(2020,2020,'year')) .filter(ee.Filter.calendarRange(10,12,'month')) .first()) .select(bands); print(image) Map.addLayer(image, {bands: ['B4', 'B3', 'B2'], max: 0.3}, 'image'); // Now, delineate polygons of 'pure' regions. Click +New Layer for // each polygon. Name the imports 'bare', 'vegetation' and 'water'. // Get the mean spectrum in each of the endmember polygons. var bareMean = image.reduceRegion(ee.Reducer.mean(), bare, 30).values(); var waterMean = image.reduceRegion(ee.Reducer.mean(), water, 30).values(); var vegMean = image.reduceRegion(ee.Reducer.mean(), vegetation, 30).values(); var snowMean = image.reduceRegion(ee.Reducer.mean(), snow, 30).values(); // Optional: plot the endmembers print(ui.Chart.image.regions(image, ee.FeatureCollection([ ee.Feature(bare, {label: 'bare'}), ee.Feature(water, {label: 'water'}), ee.Feature(vegetation, {label: 'vegetation'}), ee.Feature(snow, {label: 'snow'})]), ee.Reducer.mean(), 30, 'label', [0.48, 0.56, 0.65, 0.86, 1.61, 3.2])); // Turn the endmember lists into an array that can be used in unmixing. // Concatenate the lists along the 1-axis to make an array. var endmembers = ee.Array.cat([bareMean, vegMean, waterMean, snowMean], 1); //print(endmembers) // Turn the image into an array image, in which each pixel has a 2-D matrix. var arrayImage = image.toArray().toArray(1); // Perform the unmixing in array space using the matrixSolve image method. // Note the need to cast the endmembers into an array image. var unmixed = ee.Image(endmembers).matrixSolve(arrayImage); // Convert the result from an array image back to a multi-band image. var unmixedImage = unmixed.arrayProject([0]) .arrayFlatten([['bare', 'veg', 'water', 'snow']]); // Display the result. Map.addLayer(unmixedImage, {}, 'fractions'); // Constrained:constraining the result to be non-negative and sum to one. var constrained = image.unmix([bareMean, vegMean, waterMean, snowMean], true, true); Map.addLayer(constrained, {}, 'constrained fractions'); //Export output to Google Drive Export.image.toDrive({ image: constrained, description: 'unmix', scale: 30, region: point, maxPixels: 1e9, fileFormat: 'GeoTIFF' });
解决方法
修正导出区域参数:当前导出用的
region: point是单个点,仅会导出1个30m分辨率的像素,导致影像无有效数据。需将region替换为实际研究区范围,比如:- 手动绘制研究区多边形并命名为
studyArea,修改Export参数为region: studyArea - 或者使用
image.geometry()导出整个Landsat影像覆盖范围,修改为region: image.geometry()
- 手动绘制研究区多边形并命名为
验证端元质量:检查
bare、vegetation、water、snow等端元多边形是否为真实纯像元区域,通过print(bareMean, vegMean, waterMean, snowMean)查看端元均值是否合理,若某类端元均值异常(如全0)会导致解混结果失效。调整ArcMap显示设置:解混输出的像素值为0-1之间的小数,ArcMap默认拉伸规则无法识别。右键图层→属性→符号系统→拉伸,选择"最小值-最大值"拉伸,或手动设置显示范围为0到1即可正常显示。
确认源影像有效性:通过Map预览和
print(image)输出,检查加载的Landsat影像波段值是否正常,排除源影像全0的异常情况。
内容的提问来源于stack exchange,提问作者Mbariz
相关产品推荐
相关产品推荐

