GEE的Image对象的操作和方法

本文档介绍了如何使用Google Earth Engine(GEE)进行影像导入、波段操作、融合与可视化,包括掩膜函数、RGB合成、调色板应用及NDWI计算。重点讲解了mask、unmask和updateMask的区别,并展示了辽宁省沈阳市水体提取的实际案例。
摘要由CSDN通过智能技术生成

Image

前言

这个本人的学习笔记,记录一些学习的心得和方法,里面也会有一些不恰当的地方,望有错误的部分可以指出,如果可以帮到你,那可以给个小爱心鼓励一下吗?

如果你要直接实现一些功能,那么这篇文档可能适合你;
如果有用,那把我加入收藏夹之前,请看一看;
如果意犹未尽,那可以点个小关注~~

对了分享一下最近看的热血的视频里的几句话:
真理永远在大炮的射程之内;我们不是生活在一个和平的年代,而是生活在一个和平的国家。

叨叨几句,嘻~
在这里插入图片描述

其中后面可视化部分可参考源码

获取影像

1、ee.Image导入单张影像

var loadedImage = ee.Image('JAXA/ALOS/AW3D30/V2_2');
print(loadedImage);
Map.addLayer(loadedImage, {bands: ['AVE_DSM', 'AVE_STK', 'AVE_MSK'], min: 0, max: 2000}, "load one Image")

效果如下

注意:当我们要展示一个图片前,我们最好打印一下这个图片的信息,这样像展示波段时就不会出错!!

1

2、Get an ee.Image from an ee.ImageCollection

从ImageCollection数据集中,根据自己的需求,制定Filter规则,过滤出自己需要的影像数据。

var first = ee.ImageCollection('COPERNICUS/S2_SR')
                .filterBounds(ee.Geometry.Point(-70.48, 43.3631))  // 空间过滤
                .filterDate('2019-01-01', '2019-12-31') 			// 时间过滤
                // .sort('CLOUDY_PIXEL_PERCENTAGE', false)  // 对像素的云量的百分比进行降序排列
                .sort('CLOUDY_PIXEL_PERCENTAGE')
                .first();  
print(first);
Map.centerObject(first, 11);
Map.addLayer(first, {bands: ['B4', 'B3', 'B2'], min: 0, max: 2000}, 'first');

在这里插入图片描述

可以看到我们的ImageCollection的筛选的第一张影像的属性信息如下,红框里面就是我们上面代码里面的sort()的规则

在这里插入图片描述

3、Images from Cloud GeoTIFFs

从Google 云存储上导入数据(付费,默认不用)

影像的波段操作

1、 ee.Image.cat() 融合两个波段
2、 image.select()修改波段的名称
3、image.addBands() 添加波段
// Create a constant image.
var image1 = ee.Image(1);
print('image1', image1);

// Concatenate two images into one multi-band image.
var image2 = ee.Image(2);
print("image2", image2)
var image3 = ee.Image.cat([image1, image2]);
print('image3',image3);
Map.addLayer(image3);

// Create a multi-band image from a list of constants.
var multiband = ee.Image([1, 2, 3]);
print(multiband);


// Select and (optionally) rename bands.
var renamed = multiband.select(
    ['constant', 'constant_1', 'constant_2'], // old names
    ['band1', 'band2', 'band3']               // new names
);
print(renamed);

// Add bands to an image.
var image4 = image3.addBands(ee.Image(42));
print('image4',image4);

部分结果如下

image4
Image (3 bands)
type: Image
bands: List (3 elements)
0: "constant", int ∈ [1, 1], EPSG:4326
1: "constant_1", int ∈ [2, 2], EPSG:4326
2: "constant_2", int ∈ [42, 42],

利用select 和 cat 将影像的B2 3 4 融合成一个新的影像

var first = ee.ImageCollection('COPERNICUS/S2_SR')
                .filterBounds(ee.Geometry.Point(-70.48, 43.3631))  // 空间过滤
                .filterDate('2019-01-01', '2019-12-31') 			// 时间过滤
                // .sort('CLOUDY_PIXEL_PERCENTAGE', false)  // 对像素的云量的百分比进行降序排列
                .sort('CLOUDY_PIXEL_PERCENTAGE')
                .first();  
print(first);
Map.centerObject(first, 11);
// select使用
print(first.select("B1"));
// cat使用
var combined_rgb = ee.Image.cat(first.select("B4"), first.select("B3"), first.select("B2"));
// var combined_rgb = ee.Image.cat(first.select("B2"), first.select("B3"), first.select("B4")); 和上面的效果是一样的
print(combined_rgb);

// select 改名
var combined_rgb = combined_rgb.select(
	['B4', 'B3', 'B2'], 
    ['r', 'g', 'b'] 
);
print(combined_rgb);

Map.addLayer(combined_rgb, {bands: ['r', 'g', 'b'], min: 0, max: 2000}, "RGB");
// Map.addLayer(combined_rgb, "try_to_cat_three_bands_to_rgb"); // 还是会报错,和错题集是一样的
Map.addLayer(first, {bands: ['B4', 'B3', 'B2'], min: 0, max: 2000}, 'first');

影像的可视化

介绍

有许多 ee.Image 方法可以生成图像数据的 RGB 视觉表示,例如:visualize()、getThumbURL()、getMap()、getMapId()(用于 Colab Folium 地图显示)Map.addLayer( )(用于代码编辑器地图显示,不适用于 Python)。默认情况下,这些方法将前三个波段分别分配给红色、绿色和蓝色。

如果没有设置参数的话

默认拉伸基于带区中的数据类型(例如,浮点数在 [0, 1] 中拉伸,16 位数据拉伸到可能值的完整范围),这可能适合也可能不适合。

所以为了到达理想的效果,通过设置可视化参数;

在这里插入图片描述

Map.addLayer()

在这里插入图片描述

Map.addLayer(eeobject, visParams, name, shown, opacity);

# 参数介绍
visParams  对于功能和特色,唯一支持的键是“颜色”,作为CSS 3.0颜色字符串或“RRGGBB”格式的十六进制字符串。 EEObject是地图ID时忽略。

opacity  透明度[0, 1]  default to 1.

RGB颜色合成

Landsat合成假彩色图像 bands: [‘B5’, ‘B4’, ‘B3’]

// Load an image.
var image = ee.Image('LANDSAT/LC08/C01/T1_TOA/LC08_044034_20140318');

// Define the visualization parameters.
var vizParams = {
  bands: ['B5', 'B4', 'B3'],
  min: 0,
  max: 0.5,
  gamma: [0.95, 1.1, 1]
};

// Center the map and display the image.
Map.setCenter(-122.1899, 37.5010, 10); // San Francisco Bay
Map.addLayer(image, vizParams, 'false color composite');

color 调色板

NDWI(归一化差水指数)

var image = ee.Image('LANDSAT/LC08/C01/T1_TOA/LC08_044034_20140318');

// Create an NDWI image, define visualization parameters and display.
var ndwi = image.normalizedDifference(['B3', 'B5']);
var ndwiViz = {min: 0.5, max: 1, palette: ['00FFFF', '0000FF']};
Map.addLayer(ndwi, ndwiViz, 'NDWI', false);

在线运行结果

在这里插入图片描述

我们可以看到,调色板palette: [‘00FFFF’, ‘0000FF’], 有两个参数,一个是蓝色的十六进制,另外一个是Cyan

青色是低值,蓝色是高值。

掩膜

三种掩膜函数介绍

在GEE中有三种掩膜函数,有mask、unmask,updateMask,参考https://blog.csdn.net/SunStrongInChina/article/details/110388401

1、mask函数

使用方法:image.mask(),会将影像的掩膜区域与非掩膜区域用0和1区分开来,其中1代表为掩膜,0代表未掩膜。影像的边框范围内,黑色代表已被掩膜的区域,白色代表未掩膜区域。

2.unmask函数
使用方法,image.unmask(number), unmask的作用在于它可以将掩膜掉的区域影像值替换为任意值,而未掩膜的区域保持原值。例如image.unmask(-9999)会将掩膜掉的区域中的值替换为-9999,这样影像就可以与arcgis无缝兼容了。

3.updateMask函数
使用方法:image.updateMask(),updateMask会将影像上为0的区域掩膜掉,如果你希望某一景影像与另一景影像具有相同的掩膜,可以使用image2.updateMask(image1.mask().not())

// Load an image.
var image = ee.Image('LANDSAT/LC08/C01/T1_TOA/LC08_044034_20140318');

// Create an NDWI image, define visualization parameters and display.
var ndwi = image.normalizedDifference(['B3', 'B5']);
var ndwiMasked = ndwi.updateMask(ndwi.gte(0.4));
var unmask = ndwi.unmask(-100);
var ndwiViz = {min: 0.5, max: 1, palette: ['00FFFF', '0000FF']};
Map.addLayer(ndwi, ndwiViz, 'NDWI');
Map.addLayer(ndwiMasked, ndwiViz, 'NDWI masked');
Map.addLayer(unmask, ndwiViz, 'NDWI unmask');
print("mask", ndwi);
print("ndwiMasked", ndwiMasked);
print("unmask", unmask);

在这里插入图片描述在这里插入图片描述

总结:可以看出我们左图中updateMask() 和 ndwiMasked() 的波段范围没有差别,而在用unmask()时波段范围改变。

那么这三种淹没函数又有什么区别呢?

1、从掩膜后的可视化效果来说,updateMask() 和 unmask () 是一样的

在这里插入图片描述
在这里插入图片描述

左图为使用unmask()的效果,右图为updateMask()

2、从处理后的波段来说,updateMask() 和 mask()对波段的范围无影响;

3、从应用场景来说;

unmask()可以用于数据导出时,后续arcgis处理
updateMask()常用于预处理中的去云操作和显示一定阈值下的应影像
mask()对掩膜和非掩膜区域进行,二值化处理
示例

1、实现的需求

对辽宁省沈阳市的水体进行提取;

2、实现的过程和原理

鉴于ndwi对城市水体提取的效果差,这里我们改变一下,使用2005年徐涵秋提取来的Mndwi来提取水体,这里可以参考一下baidu MNDWI

思路:

  • 影像数据选择

    选择Landsat8 SR数据【另外提一嘴,landsat系列有两种数据,另外一种是TOA数据】,操作数据 B2 B5 波段

在这里插入图片描述

  • 影像预处理

    时间、空间的过滤、去云

  • 对影像进行MNDWI的计算和掩膜计算

// load roi
var county = ee.FeatureCollection("users/iskiwi0120/county");
var sy = ee.Geometry.Point(123.43167066301926, 41.80624074214593);
var roi = county.filterBounds(sy);

Map.centerObject(roi, 5);
Map.addLayer(roi, {color: "red"}, "shenyangshi"); 

// load ImageCollection
var l8 = ee.ImageCollection("LANDSAT/LC08/C01/T1_SR")
          .filterBounds(sy)  // 空间过滤
          .filterDate('2019-01-01', '2019-12-31') 			// 时间过滤
          // .sort('CLOUDY_PIXEL_PERCENTAGE', false)  // 对像素的云量的百分比进行降序排列
          .sort('CLOUDY_PIXEL_PERCENTAGE')
          .first();
          // .clip(roi);  
// 去云, 这里使用QA波段去云,这个去云方法适用于

function rmCloud(image) {  
 //云阴影和云
 // 移位操作相当于乘法和除法运算
 // 左移相当于乘以2^N,右移类似
  var cloudShadowBitMask = (1 << 3);  
  var cloudsBitMask = (1 << 5);  
  var qa = image.select("pixel_qa");  
  var mask = qa.bitwiseAnd(cloudShadowBitMask).eq(0)  
                     .and(qa.bitwiseAnd(cloudsBitMask).eq(0));  
  return image.updateMask(mask);  
}   
var nocloudImage = rmCloud(l8);
var mndwi = nocloudImage.normalizedDifference(['B2', 'B5']);
var mndwiMasked = mndwi.updateMask(mndwi.gte(0.2));
var mndwi_visParams = {
  min: 0.5, 
  max: 1, 
  palette: ['00FFFF', '0000FF']
};
var vi = {
      bands: ['B4', 'B3', 'B2'], 
      min: 0, 
      max: 2000
      
};
Map.addLayer(mndwi, mndwi_visParams, "sy_mndwi");
// print(mndwiMasked);
Map.addLayer(mndwiMasked, mndwi_visParams, "mndwiMasked"); // 可能是分辨率和scale的限制,在js在先编辑器里不明显
// Map.addLayer(nocloudImage.clip(roi), vi, 'nocloudImage');
Map.addLayer(nocloudImage, vi, 'nocloudImage');

// 使用mask() unmask()
var mask = nocloudImage.mask();
var unmask = nocloudImage.unmask(-20);
Map.addLayer(mask,{},'mask');
Map.addLayer(unmask,{},'unmask');
   

image.visualize()

将图像转换为 8 位 RGB 图像以进行显示或导出的方法。例如,要将伪彩色合成和 NDWI 转换为 3 波段显示图像

var imageRGB = image.visualize({bands: ['B5', 'B4', 'B3'], max: 0.5});
var ndwiRGB = ndwiMasked.visualize({
  min: 0.5,
  max: 1,
  palette: ['00FFFF', '0000FF']
});
Map.addLayer(imageRGB, {}, "image_vis");
Map.addLayer(image, {bands:  ['B5', 'B4', 'B3'], min:0, max:0.5}, "image"); 

Map.addLayer(ndwiRGB, {}, "ndwiRGB");

镶嵌

// Mosaic the visualization layers and display (or export).
var mosaic = ee.ImageCollection([imageRGB, ndwiRGB]).mosaic();
Map.addLayer(mosaic, {}, 'mosaic');

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述### 剪切

var roi = ee.Geometry.Point([-122.4481, 37.7599]).buffer(20000);

// Display a clipped version of the mosaic.
Map.addLayer(mosaic.clip(roi));

补充解释的函数

1、ee.Image.normalizedDifference(bandname);

说明:

bandname: List 形式  default = Null

使用:

用于影像的两个波段之间的归一化运算,如计算NDWI(NIR, Green) ,NDVI=(NIR-R)/(NIR+R),当然这些波段运算已经是很久之前被提取来的了,有机会我会试着去把水体指数和植被覆盖,以及一些现阶段不断从这里面发展出来的改进版给写一篇专题,不过菜鸡的我还得学学。

2、buffer(num) 缓冲区

如果num>0,则向外做缓冲区;

如果num<0,则向内做缓冲区。

  • 9
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
GEE中,我们可以使用过滤和映射操作来获得列表中对象的特定属性值。 首先,我们可以使用过滤操作来筛选出列表中符合条件的对象。比如,我们可以使用ee.Filter.eq()函数来筛选出列表中特定属性值等于给定值的对象。然后,我们再使用映射操作来提取筛选后对象的特定属性值。 举个例子,假设我们有一个包含许多卫星影像数据的列表,每个卫星影像数据对象都包含有时间属性。现在,我们想要提取出所有卫星影像数据的时间属性值。我们可以首先使用过滤操作来筛选出所有的卫星影像数据对象,然后再使用映射操作来提取出时间属性的值。 具体的代码如下所示: ```javascript // 从列表中筛选出所有卫星影像数据对象 var filteredImages = satelliteImages.filter(ee.Filter.eq('type', 'Landsat')); // 从筛选后的对象中提取时间属性的值 var timeValues = filteredImages.map(function(image) { return image.get('system:time_start'); }); // 打印时间属性的值 print('时间属性的值:', timeValues); ``` 通过以上代码,我们首先从satelliteImages列表中筛选出type属性为'Landsat'的对象,然后再从筛选后的对象中提取出system:time_start属性的值,并打印出来。 总之,在GEE中,我们可以利用过滤和映射操作来获取列表中对象的特定属性值,这为我们进行地理空间数据处理提供了很大的便利。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值