优化NDVI阈值划分的方法与Google Earth Engine(GEE)中的where函数

75 篇文章 ¥59.90 ¥99.00
本文介绍了如何在Google Earth Engine (GEE) 中利用where函数优化NDVI阈值划分,通过示例代码展示了如何获取NDVI数据、设置阈值并进行可视化,以便更好地分析植被生长状况。

NDVI(Normalized Difference Vegetation Index)是一种常用的遥感指数,用于评估植被的生长状况和覆盖程度。在Google Earth Engine(GEE)平台上,使用where函数可以有效地划分NDVI阈值,使其更符合研究需求。本文将介绍如何利用where函数来合理划分NDVI阈值,并提供相应的源代码示例。

首先,我们需要获取NDVI数据。在GEE中,我们可以使用遥感影像数据来计算NDVI。以下是获取Landsat 8影像数据并计算NDVI的示例代码:

// 选择影像数据
var image = ee.ImageCollection('LANDSAT/LC08/C01/T1_SR')
  .filterDate(
<think>由于用户希望获取在Google Earth Engine (GEE)中提高土地分类精度的代码,并且参考了站内引用(特别是引用[3]和引用[5]),我将结合GEE平台的特点,提供一套完整的提高土地分类精度的代码方案。 ### 思路分析 在GEE中提高土地分类精度,我们可以从以下几个方面入手: 1. **数据预处理**:包括云掩膜、辐射定标、地形校正等。 2. **特征工程**:加入多时相特征、纹理特征、地形特征等。 3. **分类算法**:使用更先进的机器学习算法或深度学习模型。 4. **后处理优化**:如使用众数滤波、去除小图斑等。 5. **精度验证**:采用科学的采样策略进行精度评估。 ### 完整代码方案 以下代码以10米分辨率的Sentinel-2影像为例,展示如何在GEE中实现高精度的土地分类: ```javascript // #################### // 数据预处理模块 // #################### // 定义研究区(以河南省为例) var henan = ee.FeatureCollection("users/your_account/henan_boundary"); Map.centerObject(henan, 7); // 定义时间范围 var startDate = '2024-01-01'; var endDate = '2024-12-31'; // 加载Sentinel-2影像集,并进行预处理 var s2 = ee.ImageCollection('COPERNICUS/S2_SR') .filterBounds(henan) .filterDate(startDate, endDate) // 云掩膜函数 .map(function(img) { var cloudProb = img.select('MSK_CLDPRB'); var snowProb = img.select('MSK_SNWPRB'); var cloud = cloudProb.gt(50); // 云概率大于50%视为有云 var snow = snowProb.gt(50); // 雪概率大于50%视为有雪 var mask = cloud.or(snow).not(); return img.updateMask(mask); }) .median() // 计算中值合成 .clip(henan); // 计算NDVI、NDWI等指数 var addIndices = function(image) { var ndvi = image.normalizedDifference(['B8', 'B4']).rename('NDVI'); var ndwi = image.normalizedDifference(['B3', 'B8']).rename('NDWI'); return image.addBands(ndvi).addBands(ndwi); }; s2 = addIndices(s2); // 加入地形特征(使用SRTM高程数据) var elevation = ee.Image('USGS/SRTMGL1_003').clip(henan); var slope = ee.Terrain.slope(elevation); s2 = s2.addBands(elevation.rename('elev')).addBands(slope.rename('slope')); // #################### // 特征工程模块 // #################### // 加入纹理特征(使用GLCM) var glcm = s2.select(['B8', 'B4', 'B3']).glcmTexture({size: 3}); s2 = s2.addBands(glcm.select(['B8_contrast', 'B4_contrast', 'B3_contrast'])); // 多时相特征:加入季节变化特征(以NDVI为例) var s2_spring = ee.ImageCollection('COPERNICUS/S2_SR') .filterBounds(henan) .filterDate('2024-03-01', '2024-05-31') .median().clip(henan); var ndvi_spring = s2_spring.normalizedDifference(['B8', 'B4']).rename('NDVI_spring'); s2 = s2.addBands(ndvi_spring); var s2_summer = ee.ImageCollection('COPERNICUS/S2_SR') .filterBounds(henan) .filterDate('2024-06-01', '2024-08-31') .median().clip(henan); var ndvi_summer = s2_summer.normalizedDifference(['B8', 'B4']).rename('NDVI_summer'); s2 = s2.addBands(ndvi_summer); // #################### // 样本点采集分类器训练 // #################### // 加载样本点(这里假设已经有样本点集合,实际中需要自己采集或使用现有样本) var samples = ee.FeatureCollection("users/your_account/landcover_samples"); // 定义分类特征 var features = ['B2', 'B3', 'B4', 'B8', 'B11', 'NDVI', 'NDWI', 'elev', 'slope', 'B8_contrast', 'B4_contrast', 'B3_contrast', 'NDVI_spring', 'NDVI_summer']; // 划分训练集验证集(70%训练,30%验证) var sample_set = samples.randomColumn('random'); var training = sample_set.filter(ee.Filter.lt('random', 0.7)); var validation = sample_set.filter(ee.Filter.gte('random', 0.7)); // 使用随机森林分类器(可调整参数提高精度) var classifier = ee.Classifier.smileRandomForest({ numberOfTrees: 100, // 增加树的数量 variablesPerSplit: 4, // 每个分裂考虑的特征数 minLeafPopulation: 5 // 叶子节点最小样本数 }).train({ features: training, classProperty: 'landcover', inputProperties: features }); // 执行分类 var classified = s2.select(features).classify(classifier); // #################### // 后处理优化模块 // #################### // 众数滤波(消除椒盐噪声) var kernel = ee.Kernel.square({radius: 3}); // 3x3窗口 var classified_smooth = classified.focalMode({ kernel: kernel, iterations: 2 // 迭代次数 }).rename('landcover'); // 去除小图斑(面积小于0.5公顷) var minArea = 5000; // 平方米(0.5公顷) var connected = classified_smooth.connectedPixelCount(100); // 最大连通区域100像素 var cleaned = classified_smooth.updateMask(connected.gte(minArea / 100)); // 假设分辨率为10m,则100像素=1公顷,这里取0.5公顷 // #################### // 精度评估 // #################### // 验证集精度评估 var validationAccuracy = validation.classify(classifier); var confusionMatrix = validationAccuracy.errorMatrix('landcover', 'classification'); print('混淆矩阵:', confusionMatrix); print('总体精度:', confusionMatrix.accuracy()); print('Kappa系数:', confusionMatrix.kappa()); // 导出结果 Export.image.toAsset({ image: cleaned, description: 'LandCover_Henan_2024', assetId: 'users/your_account/LandCover_Henan_2024', region: henan, scale: 10 }); // 可视化 Map.addLayer(cleaned, {min:0, max:5, palette:['green', 'brown', 'blue', 'gray', 'yellow']}, 'Land Cover'); ``` ### 关键精度提升技术说明 1. **多时相特征**:加入了春季和夏季的NDVI特征,有效捕捉植被的季节变化,提高植被类型区分度[^3]。 2. **纹理特征**:通过灰度共生矩阵(GLCM)提取了对比度纹理,增强地物边界识别能力。 3. **地形特征**:融合了高程和坡度数据,辅助区分山区和平原的土地利用类型。 4. **分类器优化**:使用随机森林分类器并调整参数(树数量、分裂特征数等),提高模型泛化能力。 5. **后处理优化**: - **众数滤波**:使用3×3窗口进行两次滤波,有效消除椒盐噪声。 - **去除小图斑**:移除面积小于0.5公顷的孤立图斑,使结果更符合地理实际。 ### 精度验证标准 采用独立验证集进行评估,要求: - **总体精度(OA) ≥ 85%** - **Kappa系数 ≥ 0.80** 若未达标,可采取以下措施: 1. 增加样本数量并确保样本质量 2. 调整分类器参数(如增加树的数量) 3. 引入更多特征(如夜光数据辅助识别城市用地[^5]) ### 深度学习方案(可选) 对于更高精度要求,可参考引用[5]的深度学习方案: ```python # 引用[5]中的深度学习流程(Python环境) # 在GEE中导出训练数据 → 使用TensorFlow训练模型 → 将模型部署回GEE进行推理 # 详细步骤见引用[5]的代码示例 ``` 深度学习方法尤其适合复杂土地利用场景,但对计算资源要求较高。 §§相关问题§§ 1. 如何在GEE中高效采集土地分类样本点? 2. 如何利用Landsat时间序列提高土地分类精度? 3. GEE中深度学习的完整工作流程是怎样的? 4. 如何结合夜光数据优化城市用地提取效果? [^3]: 如何利用Google Earth Engine提取10m精度2024年土地利用数据 | 附完整代码可视化指南。 [^5]: Google Earth EngineGEE)深度学习入门教程-Python深度学习训练篇。 </think>以下是在 Google Earth Engine (GEE) 中提高土地分类精度的完整代码方案,结合了多源数据融合、时间序列分析和深度学习等关键技术: ```javascript // ===================== // 精度提升核心模块 // ===================== // 1. 数据预处理优化 function preprocessS2(image) { // 云掩膜增强 var cloudProb = image.select('MSK_CLDPRB'); var snowProb = image.select('MSK_SNWPRB'); var mask = cloudProb.lt(10).and(snowProb.lt(5)); // 更严格的云雪过滤 // 地形校正(需要DEM数据) var dem = ee.Image('CGIAR/SRTM90_V4'); var terrain = ee.Algorithms.Terrain(dem); var slope = terrain.select('slope'); var aspect = terrain.select('aspect'); return image.updateMask(mask) .addBands(slope) // 加入地形特征 .addBands(aspect); } // 2. 多时相特征融合 function addTemporalFeatures(imageCollection) { // 计算季度NDVI中值 var quarterlyNDVI = imageCollection.map(function(img) { return img.normalizedDifference(['B8', 'B4']).rename('NDVI'); }).filter(ee.Filter.calendarRange(2023, 2024, 'year')); var q1 = quarterlyNDVI.filter(ee.Filter.calendarRange(1, 3, 'month')).median(); var q2 = quarterlyNDVI.filter(ee.Filter.calendarRange(4, 6, 'month')).median(); return ee.Image.cat([q1, q2]); // 返回季度特征影像 } // 3. 深度学习模型集成(需提前训练) var modelPath = 'users/your_account/deep_learning_model'; // 替换为实际模型路径 var deepModel = ee.Model.fromAiPlatformPredictor({ modelName: modelPath, inputTileSize: [256, 256], inputOverlapSize: [32, 32], proj: ee.Projection('EPSG:4326').atScale(10), fixInputProj: true }); // 4. 高级分类器配置 function createClassifier(samples) { return ee.Classifier.smileRandomForest({ numberOfTrees: 100, // 增加树的数量 variablesPerSplit: 8, // 优化的特征分割数 minLeafPopulation: 5, // 减少过拟合 bagFraction: 0.7 // 自助采样比例 }).train({ features: samples, classProperty: 'class', inputProperties: [ 'B2', 'B3', 'B4', 'B8', 'B11', 'B12', // Sentinel-2波段 'NDVI', 'NDWI', 'NDBI', // 植被/水体/建筑指数 'slope', 'aspect', // 地形特征 'q1_NDVI', 'q2_NDVI' // 季度特征 ] }); } // 5. 精度优化后处理 function postProcessing(classified) { // 形态学滤波(消除椒盐噪声) var filtered = classified.focalMode({ kernel: ee.Kernel.square(1.5, 'pixels'), iterations: 2 }); // 去除小图斑(<0.5公顷) var areaFilter = ee.Kernel.area({ radius: 7, units: 'meters', normalize: false }); return filtered.connectedPixelCount(areaFilter, true) .updateMask(ee.Image.pixelArea().gt(5000)); // 5000平方米=0.5公顷 } // ===================== // 主工作流程 // ===================== // 步骤1: 加载并预处理数据 var region = ee.FeatureCollection("users/your_account/henan_boundary"); var s2 = ee.ImageCollection('COPERNICUS/S2_SR') .filterBounds(region) .filterDate('2024-01-01', '2024-12-31') .map(preprocessS2) .median(); // 步骤2: 构建特征集 var ndvi = s2.normalizedDifference(['B8', 'B4']).rename('NDVI'); var ndwi = s2.normalizedDifference(['B3', 'B8']).rename('NDWI'); var ndbi = s2.normalizedDifference(['B11', 'B8']).rename('NDBI'); var temporalFeatures = addTemporalFeatures( ee.ImageCollection('COPERNICUS/S2_SR') .filterBounds(region) .filterDate('2023-01-01', '2024-12-31') ); var featureImage = ee.Image.cat([ s2.select(['B2', 'B3', 'B4', 'B8', 'B11', 'B12']), ndvi, ndwi, ndbi, temporalFeatures, s2.select(['slope', 'aspect']) ]).clip(region); // 步骤3: 加载训练样本 var samples = ee.FeatureCollection("users/your_account/training_samples"); // 步骤4: 分类融合 // 传统机器学习分类 var classifier = createClassifier(samples); var mlClassified = featureImage.classify(classifier); // 深度学习分类 var deepClassified = deepModel.predictImage( featureImage.toArray() ).argmax().rename('classification'); // 结果融合(加权投票) var finalClassified = mlClassified.add(deepClassified.multiply(2)) .divide(3) .round() .rename('landcover'); // 步骤5: 后处理优化 var result = postProcessing(finalClassified); // 步骤6: 精度验证 var validation = ee.FeatureCollection("users/your_account/validation_samples"); var accuracy = result.sampleRegions({ collection: validation, properties: ['class'], scale: 10 }).errorMatrix('class', 'landcover'); print('混淆矩阵', accuracy); print('总体精度', accuracy.accuracy()); print('Kappa系数', accuracy.kappa()); // 导出结果 Export.image.toAsset({ image: result, description: 'Henan_LandCover_2024', assetId: 'users/your_account/Henan_LandCover_2024', region: region, scale: 10, maxPixels: 1e13 }); // 可视化 Map.addLayer(result, {min: 1, max: 8, palette: [ '#006400', '#ffbb22', '#ffff4c', '#f096ff', '#fa0000', '#b4b4b4', '#f0f0f0', '#0064c8' ]}, 'Land Cover'); ``` ### 精度提升关键技术说明 1. **多源数据融合** - 集成Sentinel-2多光谱数据地形数据(SRTM DEM) - 融合季度NDVI时间序列特征($NDVI_{Q1}$, $NDVI_{Q2}$) - 结合夜光数据辅助城市识别(需添加VIIRS数据源) 2. **混合分类策略** - 机器学习(随机森林)深度学习模型融合 - 加权投票融合公式:$RF_{\text{result}} \times \frac{1}{3} + DL_{\text{result}} \times \frac{2}{3}$ - 特征工程包括: - 光谱指数:$NDVI = \frac{B8 - B4}{B8 + B4}$ - 建筑指数:$NDBI = \frac{B11 - B8}{B11 + B8}$ 3. **后处理优化** - 形态学滤波($3 \times 3$ 窗口众数滤波) - 小图斑过滤:面积阈值 $A_{\min} = 5000 \ \text{m}^2$ - 连通域分析公式:$CC = \sum_{i=1}^{n} P_i \quad \text{where} \quad P_i > \theta$ 4. **精度验证指标** - 总体精度:$OA = \frac{\sum TP}{N}$ - Kappa系数:$\kappa = \frac{p_o - p_e}{1 - p_e}$ - 类别特异性用户精度:$UA_i = \frac{TP_i}{Predicted_i}$ ### 深度学习模型训练要点 (参考引用[5]实现) ```python # Python端模型训练代码 model = tf.keras.Sequential([ layers.Conv2D(32, (3,3), activation='relu', input_shape=(256,256,12)), layers.MaxPooling2D((2,2)), layers.Conv2D(64, (3,3), activation='relu'), layers.GlobalAveragePooling2D(), layers.Dense(8, activation='softmax') ]) # GEE导出训练区块 training_data = featureImage.stratifiedSample( numPoints=1000, classBand='landcover', region=region, scale=10, tileScale=16 ) # 导出至Google Cloud Storage Export.table.toCloudStorage(...) ``` ### 精度验证标准 | 指标 | 基础要求 | 高精度目标 | |-------------|----------|------------| | 总体精度(OA) | ≥85% | ≥92% | | Kappa系数 | ≥0.80 | ≥0.90 | | 最小类别精度 | ≥75% | ≥85% |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值