GEE:Sentinel-2去云,cloudBitMask = 1 << 10,bitwiseAnd(1<<5)的含义,去云,位运算

粗浅理解

比如Sentinel-2数据的 ‘QA60’ 波段,包含Opaque clouds不透明的云和Cirrus clouds卷云
qa.bitwiseAnd(cloudBitMask).eq(0) 表示选择cloudBitMask
比特位为10的数据左移一位,并且让bit10位置的值等于0,这样就生成了云掩膜。
qa.bitwiseAnd(cirrusBitMask).eq(0) 表示选择 cirrusBitMask 比特位为11的数据左移一位,并且让bit11位置等于0,这样生成了卷云的掩膜。
③ 使用 and() 将两个掩膜合并加起来生成云和卷云的共同的大掩膜mask
④ 使用 .updateMask(mask) 更新掩膜,将无云的影像筛选出来。

符号 描述 运算规则
<< 左移 各二进位全部左移若干位,高位丢弃,低位补0
>> 右移 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)

这里的1<<10或者1<<11要换算成二进制位运算,左移10位或者11位,右边用0补位

经过CFMASK算法处理后生成一个QA60,QA60在bit10和bit11是Cloud mask(二进制表示,存在Cloud mask即为1,不存在为0)


去云以前效果

GEE:Sentinel-2去云,cloudBitMask = 1 << 10,bitwiseAnd(1<<5)的含义,去云,位运算_第1张图片

去云以后效果

GEE:Sentinel-2去云,cloudBitMask = 1 << 10,bitwiseAnd(1<<5)的含义,去云,位运算_第2张图片


代码

//导入数据
var s2 = ee.ImageCollection("COPERNICUS/S2"),
 
point = ee.Geometry.Point([112.20553071765003, 26.404020061278715]);

S2去云

//s2去云
function maskS2clouds(image) {
  var qa = image.select('QA60');
  
// Bits 10 and 11 are clouds and cirrus, respectively.
//比特10和比特11分别是云和卷云。
  var cloudBitMask = 1 << 10;
  var cirrusBitMask = 1 << 11;
  
// Both flags should be set to zero, indicating clear conditions.
//两个标志都应该设置为零,以指示清除条件
  var mask = qa.bitwiseAnd(cloudBitMask).eq(0)
      .and(qa.bitwiseAnd(cirrusBitMask).eq(0));

  return image.updateMask(mask).divide(10000);
}
var startDate = "2020-6-4";
 
  var endDate = "2020-6-30";
 
  Map.centerObject(point, 8);
 
  var s2Imgs = s2.filterDate(startDate, endDate)
 
                 .filterBounds(point);
 
  Map.addLayer(s2Imgs.first(), {min:0, max:3000, bands:["B4", "B3", "B2"]}, "raw", false);
  
 //影像集每幅影像去云
  s2Imgs = s2Imgs.map(maskS2clouds);
  
 //选择影像集第一幅影像去云,合成,显示
  Map.addLayer(s2Imgs.first(), {min:0, max:3000, bands:["B4", "B3", "B2"]}, "cloud");
 

GEE:Sentinel-2去云,cloudBitMask = 1 << 10,bitwiseAnd(1<<5)的含义,去云,位运算_第3张图片

你可能感兴趣的:(GEE,Geemap,云计算,程序人生,经验分享,其他)