GEE哨兵二号去云实验

本文介绍了一种改进的哨兵二号QA60波段去云方法,利用SVM和云量分数对图像进行处理,以应对2022年7月期间云量过多的问题。作者通过示例展示了如何结合SVM进行云检测,并分享了相关的代码片段和地图可视化结果。
摘要由CSDN通过智能技术生成

        最近突然发现哨兵二号的QA60波段,在2022年7月多按照mask掩膜去云的效果不好,可能是因为云量太高等原因。想到了之前见过的代码,于是按照云量分数和SVM进行了去云。可以在上面继续改进。

 var imageCollection = ee.ImageCollection("COPERNICUS/S2")
 var geometry =  ee.Geometry.Polygon(
              [[[116.1703785888879, 40.06062269716839],
              [116.1703785888879, 39.7065494906677],
              [116.67437639162227, 39.7065494906677],
              [116.67437639162227, 40.06062269716839]]], null, false);
// Cloud Detection of Sentinel-2 Image Coupled with SVM and Cloud Scoring Algorithm
// Sample image
var StartDate = '2018-10-10';
var EndDate = '2019-10-10';
var img = ee.ImageCollection("COPERNICUS/S2").filterBounds(geometry)
                                              .filterDate(StartDate,EndDate)
                                              .first();

Map.addLayer(img, {bands:['B4','B3','B2'],min:0,max:3000}, 'Original Image');
Map.centerObject(geometry,11);  

// QA60 band cloud detection
function QA60_cloud (img){
  var qa60 = img.select('QA60').neq(0);
  return img.updateMask(qa60).select('QA60');
}

Map.addLayer(QA60_cloud(img), {palette:['orange']}, 'QA60_band Result');

//  Cloud Scoring Algorithm 
var _cloudScore = function(img) {  
  var rescale = function(img, exp, thresholds) { 
    return img.expression(exp, {img: img}) 
          .subtract(thresholds[0]).divide(thresholds[1] - thresholds[0]); 
  }; 
  var score = ee.Image.constant(1.0); 
  score = score.min(rescale(img, 'img.blue', [0.1, 0.3])); 
  score = score.min(rescale(img, 'img.red + img.green + img.blue', [0.2, 0.8])); 
  score = score.min(rescale(img, 'img.nir + img.swir1 + img.swir2', [0.3, 0.8])); 
  var ndsi = img.normalizedDifference(['green', 'swir1']); 
  return score.min(rescale(ndsi, 'img', [0.8, 0.6])); 
}; 

function rmCloudByScore(image, thread) { 
  var preBands = ["B2","B3","B4","B8","B11","B12"]; 
  var newBands = ['blue','green','red','nir','swir1','swir2']; 
  var score = _cloudScore(image.select(preBands, newBands)); 
  score = score.multiply(100).byte().rename('cloud'); 
  return image.addBands(score) 
             //.updateMask(score.gte(thread)); 
} 

function scaleImage(image) { 
  var time_start = image.get("system:time_start"); 
  image = image.divide(10000); 
  image = image.set("system:time_start", time_start); 
  return image; 
} 

// SVM_CloudScore cloud detection
function SVM_Class (img) {
  var cloud_sample = img.select('cloud').gte(60.0).multiply(1.0).rename('cloud_sample'); 
  img = img.addBands(cloud_sample);
  print('Image Information',img)
  var training = img.stratifiedSample({
                      numPoints: 30, 
                      classBand: "cloud_sample",
                      region:geometry, 
                      scale: 30,
                      geometries: true
                    });
  Map.addLayer(training,{},'SVM Train Sample');
  var SVM_classifier = ee.Classifier.libsvm({
    kernelType: 'RBF',
    gamma: 0.5,
    cost: 10
  });
  var classifier = SVM_classifier.train(training, "cloud_sample");
  var svm_cloud  = img.classify(classifier).rename('SVM_Cloud_');
  img = img.addBands(svm_cloud);
  return  img.select('SVM_Cloud_').updateMask(img.select('SVM_Cloud_'));
}

// main function
function main() { 
  var img_Scale = scaleImage(img);
  var img_CloudScore_ = rmCloudByScore(img_Scale, 60);
  Map.addLayer(img_CloudScore_.updateMask(img_CloudScore_.select('cloud').gt(50.0)).select('cloud'), {palette:['orange']}, "Cloud Score Result"); 
  Map.addLayer(SVM_Class(img_CloudScore_),{palette:['orange']},'SVMcloud Result');
} 

main();  

去云效果图

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值