google earth engine進行非監督分類

在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');

非監督分類結果:

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類左右。

最後經過重分類,得到我需要的4類結果:

到此,利用GEE進行非監督分類就結束了。需要注意兩個問題:1.非監督分類的方法與參數選擇,可改變輸出數量;

2.得到的結果,最好就行導出,在本地進行後續處理。

希望同行多多交流,謝謝

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章