图像分类是将图像中每个像元根据其在不同波段的光谱亮度、空间结构特征或者其他信息,按照某种规则或算法划分为不同的类别。
基于光谱特征的遥感影像分类方法主要包括:
此章节重点讲解监督分类
监督分类(supervised) , 又称训练分类法, 即用被确认类别的样本像元去识别其他未知类别像元的过程。已被确认类别的样本像元是指那些位于训练区的像元。在这种分类中,分析者在图像上对每一种类别选取一定数量的训练区,计算机计算每种训练样区的统计或其他信息,每个像元和训练样本作比较,按照不同规则将其划分到和其最相似的样本类。
简单的说,首先需要从遥感影像上选取具有代表性的训练区作为样本,并进行训练;再依据一定的判别函数与判别准则,对待分像元进行类别判定。
监督分类可分两个基本步骤:
- 平行算法
- 最小距离法
- 最大似然法
…
PIE-Engine Studio 支持一下多种监督分类算法:
- AdaBoost分类分类器
- 决策树分类分类器。
- K最近邻分类分类器。
- 正态贝叶斯分类分类器。
- 随机森林分类分类器。
- svm(支持向量机)监督分类分类器。
- …
//1、获取采样区域范围
var geometry = pie.FeatureCollection("NGCC/CHINA_CITY_BOUNDARY")
.filter(pie.Filter.eq("name", "邯郸市"))
.first()
.geometry();
Map.centerObject(geometry, 6);
Map.addLayer(geometry, { color: 'FF0000', fillColor: '00000000', width: 1 }, "邯郸");
//2.调用哨兵-2 TOA数据集,设定筛选条件:日期、区域、云量
var img = pie.ImageCollection("S2/L2A")
.filterBounds(geometry)
.filterDate("2020-05-01", "2020-10-01")
.filter(pie.Filter.lte("cloudyPixelPercentage", 0.5))
.select(["B2", "B3", "B4"])
.max()
.clip(geometry);;
//设置影像参数与波段组合并加载
Map.addLayer(img, { min: 0, max: 3000, bands: ["B4", "B3", "B2"] }, "img", true);
print(img)
分类的代码编号如下:
1-水体
2-山地
3-农田
4-城镇
这一步比较麻烦,没有找到比较好的方式进行样本制作,**如果大家有比较好的方式可以私信我哈,在此先行谢过!!**我是利用ArcMap制作的样本点矢量。
注意两点:
1、样本数量多一点,每个Class十个以上吧,我这里样本选的有点少。
2、单点,PIE-Engine Studio 监督分类只支持单点格式(point)的数据,目前还不支持多点(Multipoint)的数据。所以利用ArcMap中的【Feature To Point】进行了转换。
最终的上传的矢量文件结果如下所示,上传过程见:【PIE-Engine Studio学习笔记04】上传本地数据和导出云端数据
加载显示:
var featureCollection = pie.FeatureCollection('user/Lee103/CSDN/roi_FeatureToPoint');
print("roi:", featureCollection)
Map.addLayer(featureCollection, { color: 'FF0000', fillColor: '00000000', width: 2 }, "roi");
//进行训练
var training = img.sampleRegions(featureCollection, ["Class"], 10);
print("training:", training)
// 定义SVM参数
var options = {
// SVM类型: C_SVC=100,NU_SVC=101,ONE_CLASS=102,EPS_SVR=103,NU_SVR=104
"svmType": 100,
// SVN核类型:LINEAR=0,POLY=1,RBF=2,SIGMOID=3,CHI2=4,INTER=5
"kernelType": 0,
// 核函数的γ参数,默认值为1;
"gamma": 1,
// 核函数的coef0参数,默认值为0
"coef0": 0,
// 多项式核函数的degreee参数(阶数),默认值为0;
"degree": 0,
// 用最优参数训练SVM,如果是会相当耗时
"trainAuto": 0,
// 迭代终止方式:1表示最大迭代次数 2表示最小收敛阈值 3表示最大迭代次数和最小收敛阈值组合
"type": 3,
// 最小收敛的阈值:当点之间的距离小于这个值的时候终止迭代
"minDistance": 0.1,
// 最大的迭代次数:计算多少次终止聚类迭代
"maxIter": 100
};
//分类器进行分类
var classifer = pie.Classifier.svm(options).train(training, "Class", ["B4", "B3", "B2"]);
var resultImage = img.classify(classifer, "classify_handa");
print("resultImage:", resultImage)
var visParam = {
opacity: 1,
uniqueValue: '1,2,3,4',
palette: 'EAF2F5,000032,1F3600,FAFFC8'
};
Map.addLayer(resultImage, visParam, 'handan_class');
var data = {
title: "分类结果",
colors: ['EAF2F5', '000032', '1F3600', 'FAFFC8'],
labels: ["1-山地", "2-水体", "3-农田", "4-城镇"],
step: 1
};
var style = {
right: "100px",
bottom: "10px",
height: "70px",
width: "300px"
};
var legend = ui.Legend(data, style);
Map.addUI(legend);
本节主要学习了基于PIE-Engine Studio 进行监督分类。欢迎大家批评指正,探讨交流!!!
参考:
《遥感应用分析原理与方法》赵英时