在GEE非监督分类中,需要考虑的步骤:
我先提供一个完整的代码,大家都可先看看效果:
gee 非监督分类共享链接:https://code.earthengine.google.com/c644c08bf6611a00d5123bccaf5ee871
下面是每一步具体的代码:
选择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))//云量过滤
;
首先,使用一个去云函数,读取该像素在影像集合的云量,如果超过阈值,则直接去掉该像素值。去云函数要封装好,需要的时候直接调用,这可以保证你在任意的项目中都可以使用:
//去云函数
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);
目前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 drive里面,再进行下载,进行本地化处理。
//导出
Export.image.toDrive({
image:result ,//分类结果
description: 'unsupervised_kmeans',//文件名
folder: 'unsupervised_kmeans',
scale: 30,//分辨率
region: roi,//区域
maxPixels:34e10//此处值设置大一些,防止溢出
});
由于我使用的是wekaCobweb分类方法,最后导出了大概100个类别,但是我只需要4个类别,这个时候就对分类结果进行重分类。如果你想减少工作量,可以使用KMeans方法,只导出10类左右。
最后经过重分类,得到我需要的4类结果:
到此,利用GEE进行非监督分类就结束了。需要注意两个问题:1.非监督分类的方法与参数选择,可改变输出数量;
2.得到的结果,最好就行导出,在本地进行后续处理。
希望同行多多交流,谢谢