google earth engine(GEE)进行非监督分类

在GEE非监督分类中,需要考虑的步骤:

1.筛选数据;

2.数据预处理(去云,镶嵌,裁剪等);

3.选择方法进行非监督分类;

4.结果导出;

5.使用arcgis进行分类结果的合并与重分类。

我先提供一个完整的代码,大家都可先看看效果:

gee 非监督分类共享链接:https://code.earthengine.google.com/c644c08bf6611a00d5123bccaf5ee871

下面是每一步具体的代码:

1.筛选数据;

选择landsat8作为数据源,并且制定研究区(我上传的是江苏某市的行政图),筛选研究时间,影像云量:

var startDate = ee.Date('2018-04-01'); 
var endDate = ee.Date('2018-9-30'); 
var collection = l8
                  .filterDate(startDate, endDate)//时间过滤
                  .filterBounds(roi)//位置过滤
                  .filter(ee.Filter.lte('CLOUD_COVER',10))//云量过滤
                  ;

2.数据预处理(去云,镶嵌,裁剪等);

首先,使用一个去云函数,读取该像素在影像集合的云量,如果超过阈值,则直接去掉该像素值。去云函数要封装好,需要的时候直接调用,这可以保证你在任意的项目中都可以使用:

//去云函数
var remove_cloud=function(collection)
    //************select purified pixes************/
    {
      // 计算每个像元的云分量,定义函数fun_calCloudScore
      var fun_calCloudScore = function(image) {
        return ee.Algorithms.Landsat.simpleCloudScore(ee.Image(image));//simpleCloudScore计算TOA数据每一个像元的云指数
      };
      //确定要进行函数运算的数据集以及函数
      var calCloudScore = ee.ImageCollection(collection)
          .map(fun_calCloudScore)
          ;
      
      //屏蔽阈值超过10的像素
      var fun_maskCloud = function(image) {
        // Create a mask from the cloud score and combine it with the image mask.
        var mask = image.select(['cloud']).lte(10);//TOA数据经simpleCloudScore计算产生“cloud”属性,“cloud”小于10的像元保留
        // Apply the mask to the image and display the result.显示云显示云掩膜
        return image.updateMask(mask);//更新
      };
      //确定要进行函数运算的数据集以及函数
      var maskCloud = ee.ImageCollection(calCloudScore)
          .map(fun_maskCloud)
          ;
     
      var maskCloud2=maskCloud.mean()
       print('maskCloud2',maskCloud2 )
      Map.addLayer(maskCloud,visualParam, 'maskCloud', false);//显示干净像元筛选过的maskCloud
      Map.addLayer(maskCloud2,visualParam, 'maskCloud2', false);//显示干净像元筛选过的maskCloud
      return maskCloud;
    }

之后直接对研究区进行去云、镶嵌与裁剪,这个一句话就行了:

var image=remove_cloud(collection).mosaic().clip(roi);

 

3.选择方法进行非监督分类:

目前gee提供非常多的非监督分类方法,可以根据自己的需求来,在这里我推荐大家使用:非监督分类方法wekaCobweb,wekaKMeans,wekaLVQ。需要注意的是每个方法,设置的必要参数是不一样的,这个一定要在使用前看看gee关于方法的说明,弄清楚哪些是必填项。clusters就是非监督分类结果。

//分类区域边界线
Map.addLayer(ee.Image().paint(roi, 0, 2), {}, 'roi');

//分类区域的选择
var training = image.sample({
  region: roi,
  scale: 30,
  numPixels: 5000
});

//非监督分类方法选择wekaCobweb,wekaKMeans,wekaLVQ
var clusterer = ee.Clusterer.wekaCobweb(
  {
        cutoff:0.004

      }
      ).train(training);

var result = image.cluster(clusterer);

//加载影像
Map.addLayer(result.randomVisualizer(), {}, 'clusters');

非监督分类结果:

google earth engine(GEE)进行非监督分类_第1张图片

4.结果导出;

导出到google drive里面,再进行下载,进行本地化处理。

//导出
Export.image.toDrive({
        image:result ,//分类结果
        description: 'unsupervised_kmeans',//文件名
        folder: 'unsupervised_kmeans',
        scale: 30,//分辨率
        region: roi,//区域
        maxPixels:34e10//此处值设置大一些,防止溢出
      });

5.使用arcgis进行分类结果的合并与重分类。

由于我使用的是wekaCobweb分类方法,最后导出了大概100个类别,但是我只需要4个类别,这个时候就对分类结果进行重分类。如果你想减少工作量,可以使用KMeans方法,只导出10类左右。

google earth engine(GEE)进行非监督分类_第2张图片

最后经过重分类,得到我需要的4类结果:

google earth engine(GEE)进行非监督分类_第3张图片

到此,利用GEE进行非监督分类就结束了。需要注意两个问题:1.非监督分类的方法与参数选择,可改变输出数量;

2.得到的结果,最好就行导出,在本地进行后续处理。

希望同行多多交流,谢谢

你可能感兴趣的:(GOOGLE,EARTH,ENGINE)