本文主要介绍如何利用GEE平台与哨兵2号影像提取水体。水体的提取主要是基于NDWI指数进行,当然,通过改变波段运算,也可以根据MNDWI进行提取。主要代码如下:
下面展示一些 内联代码片

//首先对数据进行去云处理
var s2_rmcloud = function(image) {var quality = image.select("QA60").unmask();return image.updateMask(quality.eq(0));
};
//NDWI
var s2_ndwi = function(image) {return image.addBands(image.normalizedDifference(["B3", "B8"]).rename("NDWI"));
};
//筛选数据 var s2_nocloud = s2_col.map(s2_rmcloud).filterBounds(roi).filterDate("2020-11-20", "2020-11-25");
var ndwi = s2_nocloud.map(s2_ndwi).select("NDWI").reduce(ee.Reducer.mean()).clip(roi);
print(ndwi)
var visParam = {min: -0.5,max: 0.5,palette: ['00FFFF', '0000FF']
};
Map.addLayer(ndwi, visParam, "ndwi");
Map.centerObject(roi,12);
//otsu算法
var otsu = function(histogram) {var counts = ee.Array(ee.Dictionary(histogram).get('histogram'));var means = ee.Array(ee.Dictionary(histogram).get('bucketMeans'));var size = means.length().get([0]);var total = counts.reduce(ee.Reducer.sum(), [0]).get([0]);var sum = means.multiply(counts).reduce(ee.Reducer.sum(), [0]).get([0]);var mean = sum.divide(total);var indices = ee.List.sequence(1, size);// Compute between sum of squares, where each mean partitions the data.var bss = indices.map(function(i) {var aCounts = counts.slice(0, 0, i);var aCount = aCounts.reduce(ee.Reducer.sum(), [0]).get([0]);var aMeans = means.slice(0, 0, i);var aMean = aMeans.multiply(aCounts).reduce(ee.Reducer.sum(), [0]).get([0]).divide(aCount);var bCount = total.subtract(aCount);var bMean = sum.subtract(aCount.multiply(aMean)).divide(bCount);return aCount.multiply(aMean.subtract(mean).pow(2)).add(bCount.multiply(bMean.subtract(mean).pow(2)));});print(ui.Chart.array.values(ee.Array(bss), 0, means));// Return the mean value corresponding to the maximum BSS.return means.sort(bss).get([-1]);
};
//归一化,去除异常值
function normalization(image,region,scale){var mean_std = image.reduceRegion({reducer: ee.Reducer.mean().combine(ee.Reducer.stdDev(),null, true),geometry: region,scale: scale,maxPixels: 1e13,// tileScale: 16
});
var unitScale = ee.ImageCollection.fromImages(image.bandNames().map(function(name){name = ee.String(name);var band = image.select(name);var mean=ee.Number(mean_std.get(name.cat('_mean')));var std=ee.Number(mean_std.get(name.cat('_stdDev')));var max=mean.add(std.multiply(3))var min=mean.subtract(std.multiply(3))var band1=ee.Image(min).multiply(band.lt(min)).add(ee.Image(max).multiply(band.gt(max))).add(band.multiply(ee.Image(1).subtract(band.lt(min)).subtract(band.gt(max))))var result_band=band1.subtract(min).divide(max.subtract(min));return result_band;
})).toBands().rename(image.bandNames());return unitScale;
}
var ndwi2=ndwi.select('NDWI_mean')
var ndwi3=normalization(ndwi2,roi,10)
var ndwi1=ndwi3.multiply(10000)
print(ndwi1)
var histogram = ndwi1.select('NDWI_mean').reduceRegion({reducer: ee.Reducer.histogram(255, 2).combine('mean', null, true).combine('variance', null, true), geometry: roi, scale: 10,bestEffort: true
});
print(Chart.image.histogram(ndwi1.select('NDWI_mean'), roi, 12));
print(histogram);
var threshold = otsu(histogram.get('NDWI_mean_histogram'));
print('threshold', threshold);
var water_mask = ndwi1.select('NDWI_mean').gt(threshold);Map.addLayer(water_mask.mask(water_mask), {palette: 'red'}, 'water');
Export.image.toDrive({image: water_mask.mask(water_mask),description: "202009",folder:"UltimateS2_R2",fileNamePrefix: "202009",scale: 10,region:roi,maxPixels: 1e13});Map.addLayer(water_mask.mask(water_mask), {palette: 'red'}, 'class A');
var countDictionary = water_mask.mask(water_mask).reduceRegion({reducer: ee.Reducer.count(),geometry: roi,scale: 10,maxPixels: 1e13
});
//把统计结果打印出来
print(countDictionary);

虽然看着很长,但是基本思想时利用阈值法提取水体,借鉴了Otsu算法确定阈值,另外加了剔除异常值的归一化算法。
基于哨兵2号1-C的数据源,作者在写代码的时候发现哨兵2号2A和哨兵2号1C的数据在去云后数据数量上不相同了,暂时不知道是什么原因,欢迎各位小伙伴来交流哇。

基于GEE平台提取水体相关推荐

  1. 【Envi风暴】基于ENVI平台提取ASTER DEM完整操作步骤(附案例数据)

    本文讲解在Envi平台上,基于Aster影像数据,提取DEM的完整操作流程及注意事项,附实验数据下载练习. 文章目录 一.内容和目的 二.提取DEM的原理 三.ENVI平台提取DEM流程 四.DEM质 ...

  2. Google Earth Engine(GEE)提取水体

    今天分享一下如何用MNDWI水体指数来提取研究区的水体,主要使用的数据为landsat8 GEE代码如下: var roi = ee.Geometry.Polygon([[[118.780422470 ...

  3. 基于GEE平台的植被覆盖度(FVC)像元二分法计算

    一.植被覆盖度计算方法 植被覆盖度FVC(Fractional Vegetation Cover)定义为单位面积内绿色植被冠层垂直投影面积所占比例.FVC是衡量地表植被状况的重要指标之一,也是区域生态 ...

  4. 基于GEE平台土地类型分类

    GEE可以进行大尺度的地物类型分类,主要原理就是根据不同地物类型的光谱反射率的不同,目前地物分类的算法有很多种,比如随机森林算法等等,本文章主要基于随机森林算法进行大尺度地物分类,代码如下所示: va ...

  5. 基于GEE与哨兵1号影像数据提取水体

    在进行光学数据提取水体时,常会发现部分时间.部分区域内由于云的存在而出现大面积的空白区域,从而使得我们提取水体面积过程中存在不精确的问题.因此,基于微波数据进行云的提取就成为我们较好的一个选择,通过阅 ...

  6. GEE:基于GEE的单个湖泊的实时水体提取(以武汉东湖为例)

    前言 博主不主修遥感方向,不是专业人士,由于毕设需要使用GEE,故临时学习并做了记录,由于是博主自己钻研的,不知道有无其他更便捷的方式.若文中有错误欢迎指正. 在做毕设的时候是对武汉市所有湖泊进行分别 ...

  7. 基于Android平台的流媒体播放器的设计

    from: 基于Android平台的流媒体播放器的设计 1引 言 随着移动通信技术和多媒体技术的迅速发展,融合手机.网络.多媒体技术为一体的视频监控技术也有了长足的进步,通过移动通信网络提供流媒体服务 ...

  8. virtuoso从电路图导入版图_基于Virtuoso 平台的单片射频收发系统电路仿真与版图设计...

    引言 在当前通信市场的带动下,通信技术飞速向前发展,手持无线通信终端成为其中的热门应用之一.因此,单片集成的射频收发系统正受到越来越广泛的关注.典型的射频收发系统包括低噪声放大器(LNA).混频器(M ...

  9. java 解析 cim e 模型 架包,基于JAVA平台的CIM模型潮流数据转换方法及装置与流程...

    本发明涉及电力系统公共信息模型领域,尤其涉及一种基于JAVA平台的CIM模型潮流数据转换方法及装置. 背景技术: CIM采用开关/节点模型描述电力系统网络,而在计算电网潮流时应用功能是母线/支路模型. ...

最新文章

  1. java中json重复数据结构_JS实现去除数组中重复json的方法示例
  2. 欧拉回路与欧拉路(模板)
  3. Oracle笔记 四、增删改、事务
  4. linux下配置java
  5. Spring Cloud【Finchley】-05使用配置文件自定义Ribbon Client
  6. vsftpd的不同安装方式及服务控制脚本
  7. swift 导出测试包(Save for Ad Hoc Deployment)卡在compile bitcode处问题
  8. 编程之美-2.17-数组循环移位
  9. john工具破解密码(Linux、ZIP等)
  10. Kubernetes教程
  11. Linux操作系统RedHat6.5安装
  12. java,javac,javap命令
  13. 开启服务器,自动加载类是否需要开辟新的线程研究
  14. unity UI 之text and image
  15. 如何学习数据库?数据库零基础入门指导
  16. 加密-网络安全之1号皇帝新衣
  17. MOOC 研究生学术与职业素养 课后答案
  18. 比扫描全能王还好用的OCR文字识别神器
  19. Labview关于波形图
  20. 【应用多元统计分析】-王学民Python主成分分析例题,特征值处理和可视化(2)

热门文章

  1. 王者荣耀背后的实时大数据平台用了什么黑科技?
  2. 无线网卡的工作模式--ath9k网卡驱动开发总结(一)
  3. Oracle课表查询系统,Oracle SQL基础练习(一)(学生表-课程表-选课表)
  4. 机器学习Matplotlib的简单使用
  5. 淘宝4位数七段显示器模块 (74HC595)
  6. 值得收藏的十个C/C++学习网站
  7. 你是在独立思考,还是在被洗脑?
  8. 跳板机(运维堡垒主机)
  9. 2020第十七届华为杯数模C题——P300脑电信号数据预处理算法
  10. 数学笔记23——部分分式