google earth engine監督分類總結與代碼分享

在我的監督分類代碼裏,我一共分爲了以下幾個步驟:

1.製作訓練樣本數據;

2.遙感數據的篩選(時間、地點與雲量);

3.遙感數據預處理(去雲、鑲嵌、裁剪);

4.構建光譜指數:NDVI、mNDWI,NDBI;

5.構建分類樣本集 並分爲訓練樣本與驗證樣本;

6.選擇合適方法進行分類;

7.精度驗證;

8.導出分類結果;

上面的步驟基本爲·監督分類常用步驟,可以根據自己的需求修改,但大體沒什麼變化。

1.製作訓練樣本數據;

構造樣本數據一般有兩個方法,一個是本地上傳矢量的訓練數據;另外一個是在GEE裏面自己選點製作。我主要介紹第二種方法。

構造樣本數據,首先創建一個new layer,然後選擇該要素,並在地圖上標點。

選擇好樣本點之後,記得打開該要素,改變圖層類型爲featurecollection,並添加分類屬性:landcover與值。比如耕地樣本點的值就爲1。

 

2.遙感數據的篩選(時間、地點與雲量);

這一步根據自己的需求選取,我代碼裏面的roi就是研究區。如果你發現研究區影像雲非常多,可以把過濾雲標準調整高一點。

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',20))//雲量過濾
                  ;

3.遙感數據預處理(去雲、鑲嵌、裁剪);

首先是構造一個去雲函數,並且做好封裝,以便你隨時調用。

var remove_cloud=function(collection)
    
    {
      // 計算每個像元的雲分量,定義函數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) {
        
        var mask = image.select(['cloud']).lte(10);//TOA數據經simpleCloudScore計算產生“cloud”屬性,“cloud”小於10的像元保留
        // 顯示雲顯示雲掩膜
        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);

4.構建光譜指數:NDVI、mNDWI,NDBI;

這一步根據每個人的要求來。我的分類體系裏面有水體,所以構建mndwi;因爲有建築,所以構建ndbi;因爲有植被,所以構建NDVI。當然,這一步可以不要。

var mndwi = image.normalizedDifference(['B3', 'B6']).rename('MNDWI');//計算MNDWI
var ndbi = image.normalizedDifference(['B6', 'B5']).rename('NDBI');//計算NDBI
var ndvi = image.normalizedDifference(['B5', 'B4']).rename('NDVI');//計算NDVI

需要注意一點的是,你計算出了這些指數,但是它們都是單幅影像,你需要把它們當做元影像的一個波段,所以需要把它們添加到你的image裏面:

image=image
      .addBands(ndvi)
      .addBands(ndbi)
      .addBands(mndwi)

5.構建分類樣本集 並分爲訓練樣本與驗證樣本;

首先需要把所有的樣本數據融合爲一個數據,即都爲訓練數據。我們現在要構造每個類別的特徵,而這些特徵包括各個波段與指數的值,所以需要一個波段選擇的過程。training就是我們需要的包含類別特徵的樣本集。

var classNames = city.merge(water).merge(tree).merge(crop).merge(bare);

var bands = ['B2', 'B3', 'B4', 'B5', 'B6', 'B7','MNDWI','NDBI','NDVI'];

var training = image.select(bands).sampleRegions({
  collection: classNames,
  properties: ['landcover'],
  scale: 30
});

由於我們需要的不僅是訓練數據,還有驗證數據。那我們把樣本分爲兩個部分:

var withRandom = training.randomColumn('random');//樣本點隨機的排列
// 我們想保留一些數據進行測試,以避免模型過度擬合。
var split = 0.7; 
var trainingPartition = withRandom.filter(ee.Filter.lt('random', split));//篩選70%的樣本作爲訓練樣本
var testingPartition = withRandom.filter(ee.Filter.gte('random', split));//篩選30%的樣本作爲測試樣本

6.選擇合適方法進行分類;

GEE提供的方法實在是太多了,這個根據個人需求來,下圖就爲gee的所有監督分類方法。

現在我們有方法,有樣本集1,那就進行分類:

// 選擇分類的屬性
var classProperty = 'landcover';

//分類方法選擇smileCart() randomForest() minimumDistance libsvm
var classifier = ee.Classifier.libsvm().train({
  features: trainingPartition,
  classProperty: 'landcover',
  inputProperties: bands
});
//分類
var classified = image.select(bands).classify(classifier);

7.精度驗證;

精度驗證,這就得用到我們之前的驗證數據集。這一步可以得到kappa係數、總體精度與轉移矩陣。

var test = testingPartition.classify(classifier);//運用測試樣本分類,確定要進行函數運算的數據集以及函數

var confusionMatrix = test.errorMatrix('landcover', 'classification');//計算混淆矩陣
print('confusionMatrix',confusionMatrix);//面板上顯示混淆矩陣
print('overall accuracy', confusionMatrix.accuracy());//面板上顯示總體精度
print('kappa accuracy', confusionMatrix.kappa());//面板上顯示kappa值

8.導出分類結果;

這個導出都千篇一律,沒什麼說的,根據自己的要求到處就行,比如說這是我的導出:

Export.image.toDrive({
        image:  classified,//分類結果
        description: 'xuzhou_cart',//文件名
        folder: 'xuzhou_cart',
        scale: 30,//分辨率
        region: roi,//區域
        maxPixels:34e10//此處值設置大一些,防止溢出
      });

下圖就是我的監督分類結果,可以看到效果還不錯:

 

最後給大家一個小建議:選擇樣本很重要,分類方法倒是次要的,要保證樣本的數量以及準確率。

 

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