基于 GEE 利用 SDWI 指数进行逐月水域面积提取

目录

1 SDWI指数

2 完整代码

3 运行结果



微波遥感具有全天候、全天时工作能力,能穿透云层,不受气象条件和光照水平影响,因此近年来利用微波遥感提取水体信息也备受关注。本文分享使用 Sentinel-1遥感影像通过SDWI指数来进行逐月水域面积计算提取和结果导出。

1 SDWI指数

Sentinel-1双极化数据SDWI水体提取指数公式:SDWI = ln ⁡(10×VV×VH)

Sentinel-1 Dual-Polarized Water Index (SDWI)水体信息提取方法对 Sentinel-1 双极化数据(VV 和 VH)之间水体信息提取的关系进行深入研究,达到增强水体特征的效果,水体区分较明显,同时消除土壤和植被对水体提取中造成的干扰。公式的指导思想是将 VV 和 VH 极化影像相乘,并且乘以 10,以此扩大水体与其他地物之间的差异,再以自然对数作为函数式。

2 完整代码

// 引入感兴趣区(ROI)并添加到地图
var roi = table;
Map.addLayer(roi);
Map.centerObject(roi, 8);

// 设置时间范围和生成每月的日期范围
var startYear = 2021;
var endYear = 2023;
var months = ee.List.sequence(1, 12);

// 使用Sentinel - 1数据集
var s1Collection = ee.ImageCollection('COPERNICUS/S1_GRD')
  .filterBounds(roi)
  .filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VV'))
  .filter(ee.Filter.eq('instrumentMode', 'IW'));

// 定义 SDWI 计算函数
var calculateSDWI = function(image) {
  var VV = image.select('VV');
  var VH = image.select('VH');
  return image.expression(
    'log(10 * VV * VH) - 8',
    { 'VV': VV, 'VH': VH }
  ).rename('SDWI');
};

// 计算逐月水体掩膜面积
var calculateMonthlyWaterArea = function(year, month) {
  // 获取该月的开始和结束日期
  var startDate = ee.Date.fromYMD(year, month, 1);
  var endDate = startDate.advance(1, 'month');

  // 过滤 Sentinel - 1 图像集以获取当月的图像
  var monthlyCollection = s1Collection
    .filterDate(startDate, endDate)
    .map(calculateSDWI);

  // 计算月度水体掩膜
  var sdwiComposite = monthlyCollection.median().clip(roi);
  var waterMask = sdwiComposite.gt(-0.1).rename('WaterMask');

  // 计算水体面积(平方千米)
  var areaImage = waterMask.multiply(ee.Image.pixelArea()).divide(1e6);
  var waterArea = areaImage.reduceRegion({
    reducer: ee.Reducer.sum(),
    geometry: roi,
    scale: 10,
    maxPixels: 1e9
  }).get('WaterMask');

  // 返回一个包含年、月和水体面积的字典
  return ee.Feature(null, {
    'Date': startDate.format('yyyy/M/d'),
    'Year': year,
    'Month': month,
    'WaterArea_km2': waterArea
  });
};

// 对每个月进行水体面积计算并转换为 FeatureCollection
var calculateWaterAreaByMonth = function(year) {
  return ee.FeatureCollection(
    months.map(function(month) {
      return calculateMonthlyWaterArea(year, month);
    })
  );
};

// 将所有年份的水体面积合并到一起
var allYearsWaterArea = ee.FeatureCollection(
  ee.List.sequence(startYear, endYear).map(calculateWaterAreaByMonth)
).flatten();

// 导出逐月水体面积到 CSV 文件
Export.table.toDrive({
  collection: allYearsWaterArea,
  description: 'Monthly_Water_Area_2021_2022',
  fileFormat: 'CSV'
});

// 可视化参数
var visParams = {
  min: 0,
  max: 1,
  palette: ['FFFFFF', '0000FF'] // 蓝色表示水体,白色表示非水体
};

// 将逐月水体掩膜加载到地图上,并导出影像
for (var year = startYear; year <= endYear; year++) {
  for (var month = 1; month <= 12; month++) {
    var startDate = ee.Date.fromYMD(year, month, 1);
    var endDate = startDate.advance(1, 'month');

    var monthlyCollection = s1Collection
      .filterDate(startDate, endDate)
      .map(calculateSDWI);

    var sdwiComposite = monthlyCollection.median().clip(roi);
    var waterMask = sdwiComposite.gt(-0.1).rename('WaterMask');

    // 在地图上显示每个月的水体掩膜
    var label = 'WaterMask_' + year + '_' + month;
    Map.addLayer(waterMask, visParams, label);

    // 导出逐月影像
    Export.image.toDrive({
      image: waterMask,
      description: 'WaterMask_' + year + '_' + month,
      folder: 'GEE/DTH/images',
      fileNamePrefix: 'WaterMask_' + year + '_' + month,
      region: roi,
      scale: 10,
      maxPixels: 1e13
    });
  }
}

3 运行结果

运行结果图层
运行结果
点击RUN即可下载数据
### 遥感图像处理中的水体提取方法 #### 单波段阈值法 单波段阈值法是一种简单直接的方法,适用于特定条件下的水体提取。该方法主要依赖于某一选定波段内的像素灰度值分布特性来区分水体和其他地物。对于Landsat 8 OLI传感器获取的数据而言,近红外(NIR)或短波红外(SWIR)波段常被用于此目的,因为这两个波段对水分有较高的敏感性[^1]。 ```python import numpy as np from skimage import io, filters def single_band_threshold(image_path, band_index=5): # 默认选择NIR波段(OLI第5波段) img = io.imread(image_path)[..., band_index] threshold_value = filters.threshold_otsu(img) water_mask = (img < threshold_value).astype(np.uint8)*255 return water_mask ``` #### 谱间关系分析法 这种方法基于不同物质反射光谱特性的差异来进行分类。具体来说,在可见光至短波红外范围内,水体会表现出与其他自然表面截然不同的反射率曲线形状。因此可以通过计算两个或多个人工定义的指数或者比率指标来突出显示潜在水域位置。 #### 水体指数法 NDWI(Normalized Difference Water Index)、MNDWI(Modified Normalized Difference Water Index)等都是常用的水体指数形式。它们利用了水体在某些波段上的强吸收特点以及植被或其他背景物体在此类波段上相对较低的响应强度之间的对比效应。这使得即使是在复杂背景下也能有效地分离出水面信息。 ```python def calculate_ndwi(nir_image, green_image): ndwi = (green_image.astype(float)-nir_image)/(green_image+nir_image+np.finfo(float).eps) return ndwi ``` #### OTSU自动阈值分割 OTSU算法能够自适应地找到最佳分割点,从而将整个场景划分为前景(即水体)和背景两部分。这一过程不需要预先设定固定的门限值,而是依据直方图统计规律动态调整,提高了结果的一致性和可靠性[^2]。 ```python def otsu_segmentation(gray_img): from skimage.filters import threshold_otsu thresh = threshold_otsu(gray_img) binary = gray_img > thresh return binary ``` #### 基于深度学习的语义分割 近年来,随着计算机视觉技术的发展,特别是卷积神经网络(CNNs)的成功应用,出现了许多新的思路和技术手段用来改进传统遥感影像解译流程。例如采用UNet架构训练专门面向高分辨率卫星图片中水系要素识别的任务模型,不仅提升了检测效率还增强了抗干扰性能[^4]。 ```python # 这里仅提供概念示意代码片段,实际部署需参照相应框架文档完成搭建工作。 class UNet(nn.Module): ... model = UNet() output = model(input_tensor) predicted_water_map = torch.argmax(output, dim=1) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值