基于GEE与哨兵1号影像数据提取水体
在进行光学数据提取水体时,常会发现部分时间、部分区域内由于云的存在而出现大面积的空白区域,从而使得我们提取水体面积过程中存在不精确的问题。因此,基于微波数据进行云的提取就成为我们较好的一个选择,通过阅读各种文献以及实践,我在原有基于GEE平台和哨兵1号影像提取水体代码的基础上,进行了部分补充,从而使得提取水体的精度更加准确。代码如下所示:
原文链接:基于GEE与哨兵1号影像数据提取水体
// An highlighted block
var slope_lib = require('users/wushupu18/Nanhu:slope_correction_lib.js');
var start = '2020-04-01';
var end = '2020-04-30';
Map.centerObject(Buffer, 12);
var s1_collection = ee.ImageCollection('COPERNICUS/S1_GRD')
.filterBounds(Buffer)
.filterDate(start, end)
.filter(ee.Filter.and(
ee.Filter.listContains('transmitterReceiverPolarisation', 'VV'),
ee.Filter.listContains('transmitterReceiverPolarisation', 'VH'),
ee.Filter.eq('instrumentMode', 'IW')
));
print(s1_collection)
//地形校正
var volume = slope_lib.slope_correction(s1_collection,
{'model': 'volume',
'elevation': ee.Image('USGS/SRTMGL1_003'),
'buffer': 50
});
var surface = slope_lib.slope_correction(s1_collection,
{'model': 'surface',
'elevation': ee.Image('USGS/SRTMGL1_003'),
'buffer': 50
}
);
print(s1_collection.mean(), 'First image of the original S1 collection')
print(volume.mean(), 'First image of the corrected S1 collection');
print(volume.mean(), 'First image of the corrected S1 collection');
var S1 = volume.map(function(img){
img = img.clip(Buffer)
return img;
});
Map.addLayer(S1.mean(),{bands: 'VV',min: -18, max: 0}, 'S1')
var filterSpeckles = function(img) {
var vv = img.select('VV')
var vh= img.select('VH')
//滤波处理
var vv_smoothed = vv.focal_mean(50,'circle','meters').rename('VV_Filtered')
var vh_smoothed = vh.focal_mean(50,'circle','meters').rename('VH_Filtered')
return img.addBands(vv_smoothed).addBands(vh_smoothed)
}
S1 = S1.map(filterSpeckles)
Map.addLayer(S1.mean(),{bands: 'VV_Filtered',min: -30, max: 0}, 'Filtered SAR image')
var SVV = S1.select("VV_Filtered").reduce(ee.Reducer.mean()).rename("VV_mean");
var SVH = S1.select("VH_Filtered").reduce(ee.Reducer.mean()).rename("VH_mean");;
var Sen1=SVV.addBands(SVH)
print(Sen1)
//SDWI
function SDWI_V1(Sen1) {
var VH = Sen1.select("VH_mean");
var VV = Sen1.select("VV_mean");
var x = VV.multiply(VH).multiply(10);
var y=(x).log();
var sdwi=y.subtract(8);
return sdwi;
}
var sdwi1 = SDWI_V1(Sen1).select("VV_mean").rename("sdwi");
print(sdwi1)
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);
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 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: 10e9,
});
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 sdwi2=sdwi1.select('sdwi')
var sdwi3=normalization(sdwi2,Buffer,10)
var sdwi_1=sdwi3.multiply(10000)
print(sdwi1)
var histogram = sdwi_1.select('sdwi').reduceRegion({
reducer: ee.Reducer.histogram(255, 2)
.combine('mean', null, true)
.combine('variance', null, true),
geometry: Buffer,
scale: 10,
bestEffort: true
});
print(Chart.image.histogram(sdwi_1.select('sdwi'), Buffer, 10));
print(histogram);
var threshold = otsu(histogram.get('sdwi_histogram'));
print('threshold', threshold);
var classA = sdwi_1.select('sdwi').gt(threshold);
Map.addLayer(classA.mask(classA), {palette: 'red'}, 'class A');
var countDictionary = classA.mask(classA).reduceRegion({
reducer: ee.Reducer.count(),
geometry: Buffer,
scale: 10,
maxPixels: 1e13
});
print(countDictionary);
经过实验发现,哨兵1号影像在平坦的地区适用性较好,但是在山地地区,常会出现阴影被误判成山体的情况。代码中参考前人研究成果,加入了地形校正去除阴影的处理,但是提升有限,部分阴影并不能完全去除。大家在用代码时,尽量结合自己的研究区进行修改参数,从而使得提取效果更好。
基于GEE与哨兵1号影像数据提取水体相关推荐
- 基于python实现高分二号遥感影像水体提取与水质反演(黑臭水体与水体富营养化)
高分二号遥感影像水体提取与水质反演 水体提取函数--NDWI 基于几何约束提取河流 生成shp,方便后续裁剪水体 水质反演 最终结果 水体提取函数--NDWI 水体提取函数water.py impor ...
- GIS实战应用案例100篇(七)-基于GIS和ENVI的矢量化提取水体边界
一.影像准备 本期以威宁草海为例,用到的影像为2020年11月13日覆盖草海地区的一景高分一号宽幅(WFV4)影像,景序列号为5191489. 二.影像预处理 因本期内容不涉及到定量遥感,所以只需对该 ...
- 基于GEE平台提取水体
本文主要介绍如何利用GEE平台与哨兵2号影像提取水体.水体的提取主要是基于NDWI指数进行,当然,通过改变波段运算,也可以根据MNDWI进行提取.主要代码如下: 下面展示一些 内联代码片. //首先对 ...
- ENVI 5.3 + 哨兵2号(Sentinel-2)L2A提取健康水体和不健康水体
大学是学GIS的,最近因为需要而搞起了遥感影像,不过GIS和RS不分家嘛!多了解学习没有坏处!针对学习过程中遇到的问题和获得的收获,特发文一篇以作记录,积累经验. [1.数据下载] 首先需要下载数据, ...
- GEE哨兵二号去云不成功的原因(代码修改)
基于GEE的哨兵二号QA波段去云,但是去不成功 原因:因为筛选出来的影像云量几乎都超过50% 官方的官方的解答:文档里是提取云量20以下的进行去云的 源码: // 去云 function maskS2 ...
- GEE:基于GEE的单个湖泊的实时水体提取(以武汉东湖为例)
前言 博主不主修遥感方向,不是专业人士,由于毕设需要使用GEE,故临时学习并做了记录,由于是博主自己钻研的,不知道有无其他更便捷的方式.若文中有错误欢迎指正. 在做毕设的时候是对武汉市所有湖泊进行分别 ...
- QGIS基于多期哨兵2影像遥感指数阈值法提取冬小麦分布(4)-分类精度评价
本文继续介绍使用QGIS基于多期哨兵2影像遥感指数阈值法提取冬小麦分布,本文为教程的第四部分:分类结果精度评价.所使用的示范数据下载地址为: 链接: https://pan.baidu.com/s/1 ...
- QGIS基于多期哨兵2影像遥感指数阈值法提取冬小麦分布(3)-NDVI阈值
本文继续介绍使用QGIS基于多期哨兵2影像遥感指数阈值法提取冬小麦分布,本文为教程的第三部分:NDVI阈值选择和冬小麦种植面积提取.所使用的示范数据下载地址为: 链接: https://pan.bai ...
- GEE|下载研究区哨兵二号影像
任何一个遥感人不用GEE下载遥感影像我都会伤心的ok?!! 众所周知哨兵二号影像可以在usgs上或者欧空局网站下载,usgs感觉还相对更方便些.但是都还是避免不了下载影像后先用SNAP预处理大气校正重 ...
最新文章
- linux 生成密码本,Linux下CentOS7使用OTPW实现双因子密码本登录
- 为排序使用索引OrderBy优化
- Redis(二):Redis的安装及配置(2)---设置启动信息
- 关于 C 的 arithmetic conversion (进行 算术运算 时的 强制转换规则)
- mysql批量添加报错_技术分享 | MySQL 在批量插入时捕捉错误信息
- 关于jQuery的细节
- php表格批量修改数据,php批量修改数据库表名前缀
- 计算机财务管理复利现值的公式,财务管理公式
- atitit.故障排除------有时会错误com.microsoft.sqlserver.jdbc.SQLServerException: Connection reset by peer: soc
- 计算机联锁静态数据表,计算机联锁功能.doc
- 高性能计算机重要的配件,电脑配件大盘点,为高性能保驾护航!
- 【6G】基于 Dyncast 的算力网络架构
- 加拿大鹅“跌倒”,波司登“吃饱”?
- 为什么宝宝做错事被骂哭后,还要求抱抱?家长早知道早受益
- html单元格分割,html – 拆分td在两个
- java实现端口映射_Java BIO实现TCP端口转发(端口映射)功能源码
- 真实生活的记录:我三年的外企生涯(4) 出处:天涯虚拟社区
- 关于蓝桥杯嵌入式CT117-M1(旧板)stm32f103芯片的coocox keil5 烧写办法
- 看过来!2021年最新PMP报名流程来了
- 开课吧:未来人工智能发展前景如何呢?
热门文章
- CNN卷积层神经元数量、连接数量、权重数量的计算
- 清华大学出版社计算机图书出版,请联系我
- 2016-2017 CT S03E06: Codeforces Trainings Season 3 Episode 6(8/13)
- UNCTF2022-公开赛|MISC(下)
- linux java环境变量不生效_Linux下java环境变量配置问题,解决 重新打开bash后JDK环境变量无效问题...
- m35c android 4.4,索尼M35c拍照比之前有很大改善_索尼 Xperia SP_手机Android频道-中关村在线...
- 计算机系统要素--第六章,02-HACK汇编编译器实现
- python期末试题汇总
- 计算机端口怎么配置波特率,PLC波特率设置
- .net 1.1的东西没有学精 .net 2.0的东西浩如烟海 .net 3.0 3.5就要应用实践了。。。