在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.得到的結果,最好就行導出,在本地進行後續處理。
希望同行多多交流,謝謝