去水体的原理旨在利用绿波波段(Green Band)和近红外波段(NIR Band)构建归一化水体指数(NDWI),该指数能够很好的识别出水体,计算公式如下:
以Landsat 8数据为例,水体掩膜代码如下:
function waterMask(image) {
var ndwi = image.normalizedDifference(['B3', 'B5'])
var mask = ndwi.lt(0.2) // default 0.2
return image.updateMask(mask)
};
在水体掩膜阈值中,常用ndwi < 0.2来作为水体的界限;本文使用了0.1和0.2两种阈值,来探讨和对比其各自的去水体效果。
数据准备:
为了防止去云处理对去水体处理产生干扰,在数据处理部分省去了去云处理。
本文选取了两景云量很少的Landsat 8数据,img1:LANDSAT/LC08/C02/T1_TOA/LC08_127042_20220906,云量为0.11%;
img2:LANDSAT/LC08/C02/T1_TOA/LC08_127041_20220906,云量为0.56%。
结果比较:
分别在湿地和河流区域进行了对比:
湿地原始 | ![]() |
湿地0.1 | ![]() |
湿地0.2 | ![]() |
河流原始 | ![]() |
河流0.1 | ![]() |
河流0.2 | ![]() |
由以上结果可知,无论在湿地还是河流区域,0.1和0.2的差别不是很显著,微弱的差别得放大图像才能看清:0.1的阈值水体掩膜范围比0.2的更大,在图像上表现为更为圆滑和彻底;即:水体掩膜的阈值越小,去水体效果更为彻底。
完整代码如下:
// For a Landsat Image:
// data to prepare
var img1 = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_127042_20220906');
var img2 = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_127041_20220906');
// to view metadata
// print(img1, img2);
//__________________________________________________________________________________________________
// to generate unwatermasked image
var unwatered_Img = ee.ImageCollection([img1, img2])
.mosaic()
.clip(roi);
// Map.centerObject(unwatered_Img, 7)
// Map.addLayer(unwatered_Img.select(['B4', 'B3', 'B2']), {}, 'unwatered_Img')
Export.image.toDrive({
image: unwatered_Img.select(['B4', 'B3', 'B2']),
description: 'unwatered_Img',
folder: 'GEE_downloads',
scale: 30,
region: roi,
crs: 'EPSG: 4326'
});
//________________________________________________________________________________________________
// set the threshold 0.1
function waterMask01(image) {
var ndwi = image.normalizedDifference(['B3', 'B5'])
var mask = ndwi.lt(0.1)
return image.updateMask(mask)
};
var watermasked_Img01 = ee.ImageCollection([img1, img2])
.map(waterMask01)
.mosaic()
.clip(roi);
// Map.centerObject(watermasked_Img01, 7)
// Map.addLayer(watermasked_Img01.select(['B4', 'B3', 'B2']), {}, 'watermasked_Img01')
Export.image.toDrive({
image: watermasked_Img01.select(['B4', 'B3', 'B2']),
description: 'watermasked_Img01',
folder: 'GEE_downloads',
scale: 30,
region: roi,
crs: 'EPSG: 4326'
});
//__________________________________________________________________________________________________
// set the threshold 0.2
function waterMask02(image) {
var ndwi = image.normalizedDifference(['B3', 'B5'])
var mask = ndwi.lt(0.2)
return image.updateMask(mask)
};
var watermasked_Img02 = ee.ImageCollection([img1, img2])
.map(waterMask02)
.mosaic()
.clip(roi);
// Map.centerObject(watermasked_Img02, 7)
// Map.addLayer(watermasked_Img02.select(['B4', 'B3', 'B2']), {}, 'watermasked_Img02')
Export.image.toDrive({
image: watermasked_Img02.select(['B4', 'B3', 'B2']),
description: 'watermasked_Img02',
folder: 'GEE_downloads',
scale: 30,
region: roi,
crs: 'EPSG: 4326'
});