在遥感中,图像分类是尝试将图像中的所有像素分类为有限数量的标记土地覆盖和/或土地利用类别。 生成的分类图像是从原始图像导出的简化专题图(图 1), 土地覆盖和土地利用信息对于许多环境和社会经济应用至关重要,包括自然资源管理、城市规划、生物多样性保护、农业监测和碳核算。
图1 图像分类概念
用于生成土地覆盖和土地利用信息的图像分类技术自 20 世纪 80 年代以来一直在使用, 在关于图像分类的系列内容中,我们将介绍基于像素的监督和无监督分类的概念,并测试不同的分类器,本期内容我们将介绍监督分类。
※监督分类
监督分类使用具有已知标签并代表每个感兴趣的土地覆盖类别的光谱特征的训练数据集来“监督”分类。 Earth Engine 中监督分类的总体方法总结如下:
1. 获取场景;
2.收集训练数据;
3. 使用训练数据选择并训练分类器;
4. 使用选定的分类器对图像进行分类。
我们将首先根据清晰的陆地卫星图像手动创建训练数据(图 2),复制下面的代码块来定义您的 Landsat 8 场景变量并将其添加到地图中, 我们将使用意大利米兰的一个点作为图像分类区域的中心。
// Create an Earth Engine Point object over Milan.
var pt = ee.Geometry.Point([9.453, 45.424]);
// Filter the Landsat 8 collection and select the least cloudy image.
var landsat = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')
.filterBounds(pt).filterDate('2019-01-01', '2020-01-01')
.sort('CLOUD_COVER').first();
// Center the map on that image.
Map.centerObject(landsat, 8);
// Add Landsat image to the map.
var visParams = {bands: ['SR_B4', 'SR_B3', 'SR_B2'],min: 7000,max: 12000
};
Map.addLayer(landsat, visParams, 'Landsat 8 image');
图2 Landsat图像
我们将使用几何(geometry)工具,在 Landsat 图像上创建代表感兴趣的土地覆盖类别的点,以用作我们的训练数据。 我们需要做两件事:(1) 确定每个土地覆盖在地面上的位置,(2) 用正确的类别编号标记点。 对于本练习,我们将使用表 1 中给出的类和代码。
表1 土地覆盖类型
在几何工具中,单击标记选项(图 3, 这将创建一个点几何图形,该几何图形将显示为名为“geometry”的导入。 单击齿轮图标可配置此导入。
图3 在Geometry Imports中创建一个新图层
我们将从收集森林点开始,因此命名导入forest。 将其导入为 FeatureCollection,然后单击 + 属性。 将新属性命名为“class”并为其指定值 0(图 4)。 我们还可以选择一种颜色来代表这个类,对于森林类来说,自然选择绿色, 您可以通过单击选择您喜欢的颜色,或者为了进行更多控制,您可以使用十六进制值。
图4 编辑几何图层的属性
十六进制值在整个数字世界中用于表示计算机和操作系统中的特定颜色,它们由分成三对的六个值指定,其中红色、绿色和蓝色亮度值各一对。 如果您不熟悉十六进制值,请想象一下,颜色是以 10 基数对而不是 16 基数对指定的,在这种情况下,明亮的纯红色值将是“990000”; 明亮的纯绿色值为“009900”; 明亮的纯蓝色值为“000099”。 像“501263”这样的值将是三种颜色的混合,不是特别明亮,蓝色和红色的数量大致相等,绿色的数量要少得多:一种带有紫色阴影的颜色。 要在十六进制系统中创建数字(如果人类进化到有 16 个手指,这可能会感觉完全自然),需要十六个“数字”:以 16 为基数的计数器表示 0、1、2、3、4、5、6、7、 8、9、A、B、C、D、E、F,然后是 10、11,依此类推。 考虑到该计数框架,数字“FF”就像以 10 为基数的“99”:最大的两位数。 本书中用于为“FeatureCollection”一词的字母着色的十六进制颜色是“7F1FA2”,这种颜色的蓝色和红色的数量大致相等,绿色的数量少得多。
回到森林点的着色,十六进制值“589400”有点红色,大约是绿色的两倍,没有蓝色:深绿色如图4所示。 输入该值,前面带或不带“#”,完成配置后单击“确定”。
现在,在几何导入中,我们将看到导入已重命名为forest。 单击它可激活绘图模式(图 5),以便开始收集森林点。
现在,开始在森林地区收集点(图 6),根据需要放大和缩小, 您可以使用卫星底图来帮助您,但收集的基础应该是 Landsat 图像。 请记住,您收集的份数越多,分类器从您提供的信息中学到的信息就越多。 现在,让我们设定一个目标,每类获得25个样点,完成后单击“Point drawing”(图 5)旁边的“Exit”。
通过创建新图层对其他类重复相同的过程(图 7)。不要忘记使用上面提到的 FeatureCollection 选项进行导入。 对于建设用地,在城市地区收集样点,对于水类,收集利古里亚海的点,并寻找其他水体,例如河流。 对于草本类,在农田上收集点, 请记住将每个类别的“class”属性设置为其相应的代码(参见表1),并在如上所述完成每个类别的收集点后单击“退出”。 我们将为其他类别使用以下十六进制颜色:#FF0000 表示建设用地,#1A11FF 表示水,#D0741E 表示草本。
图5 激活森林图层进行收集
图6 收集的森林点
图7 几何导入中的新图层选项
您现在应该有四个FeatureCollection 导入,分别命名为forest、development、water 和herbaceous(图8)。
图8 训练样点示例
下一步是将所有训练特征集合合并为一个。 复制并粘贴下面的代码,将它们合并到一个名为trainingFeatures 的FeatureCollection 中。 在这里,我们使用 flatten 方法来避免拥有特征集合的集合 - 我们希望在特征集合中包含单独的特征。
// Combine training feature collections.
var trainingFeatures = ee.FeatureCollection([
forest, developed, water, herbaceous]).flatten();
在组合的FeatureCollection中,每个Feature点都应该有一个名为“class”的属性。 类值是从 0 到 3 的连续整数(您可以通过打印训练特征并检查特征的属性来验证这是否正确)。
现在我们有了训练点,复制并粘贴下面的代码以提取每个点位置处每个类别的波段信息。 首先,我们定义预测波段,以从每个类别的不同波段中提取不同的光谱和热信息。 然后,我们使用sampleRegions方法从Landsat图像中每个点位置的信息进行采样。 此方法需要有关特征集合(我们的参考点)、要提取的属性(“类”)和像素比例(以米为单位)的信息。
// Define prediction bands.
var predictionBands = [
'SR_B1', 'SR_B2', 'SR_B3', 'SR_B4', 'SR_B5', 'SR_B6','SR_B7','ST_B10'
];
// Sample training points.
var classifierTraining = landsat.select(predictionBands)
.sampleRegions({collection: trainingFeatures,properties: ['class'],scale: 30
});
您可以通过打印并扩展第一个特征来检查 classifierTraining 对象是否提取了感兴趣的属性。 您应该会看到波段和类别信息(图 9)。
现在我们可以选择一个分类器, 分类器的选择并不总是显而易见的,并且有很多选项可供选择 - 您可以快速展开 Docs 下的 ee.Classifier 对象,以了解我们有多少种图像分类选项。 因此,我们将测试不同的分类器并比较它们的结果。 我们将从分类与回归树 (CART) 分类器开始,这是一种已经存在了数十年的著名分类算法(图10)。
图9 类0(森林)的一个点提取的波段信息示例
图 10 卫星图像分类决策树示例,值和类别是假设的
复制并粘贴以下代码以实例化 CART 分类器(ee.Classifier.smileCart) 并训练它。
CART Classifier ///
// Train a CART Classifier.
var classifier = ee.Classifier.smileCart().train({features: classifierTraining,classProperty: 'class',inputProperties: predictionBands
});
本质上,分类器包含将标签链接到光谱信息的数学规则。 如果打印变量分类器并展开其属性,则可以确认对象的基本特征(波段、属性和正在使用的分类器)。 如果打印classifier. explain,您可以找到一个名为“tree”的属性,其中包含决策规则。训练分类器后,复制并粘贴以下代码对Landsat图像进行分类并将其添加到地图中。
// Classify the Landsat image.
var classified =landsat.select(predictionBands).classify(classifier);
// Define classification image visualization parameters.
var classificationVis = {min: 0,max: 3,
palette: ['589400', 'ff0000', '1a11ff', 'd0741e']
};
// Add the classified image to the map.
Map.addLayer(classified, classificationVis, 'CART classified');
注意,在可视化参数中,我们定义了一个调色板参数,在本例中它表示每个像素值(0-3,我们的类代码)的颜色。我们使用为每个类创建训练点时使用的相同十六进制颜色。 这样,我们可以在地图中可视化分类图像时将颜色与类别相关联。检查结果:激活 Landsat 复合图层和卫星底图以与分类图像叠加(图 11)。 更改图层的透明度以检查某些区域。 你注意到了什么? 在某些领域,结果可能看起来不太令人满意(例如,建设用地和草地之间的混淆),您认为为什么会发生这种情况? 有一些选项可以处理错误分类错误:
图11 CART分类
①收集更多的训练数据:我们可以尝试合并更多的点以获得更具代表性的类样本。
②调整模型:分类器通常具有设置为默认值的“超参数”。 例如,在分类树的情况下,有多种方法可以调整树中叶子的数量。
③尝试其他分类器:如果某个分类器的结果不令人满意,我们可以尝试Earth Engine 中的其他一些分类器,看看结果是否更好或不同。
④扩展收集位置:最好在整个图像上收集点,而不仅仅是集中在一个位置。 此外,寻找显示变异性的同一类别的像素(例如,对于建设用地类别,建筑物屋顶看起来与房屋屋顶不同;对于草本类别,农田显示出独特的季节性/物候)。
⑤添加更多预测变量:我们可以尝试向输入变量添加谱索引; 通过这种方式,我们可以向分类器提供有关每个类别的新的、独特的信息。 例如,专门用于检测植被健康状况的植被指数(例如 NDVI)很有可能改善发达的与草本植物的分类。
图12 随机森林的一般概念
现在,我们将尝试另一种广泛使用的监督学习分类器:随机森林(RF)。 RF 算法建立在决策树的概念之上,但添加了策略以使其更加强大。 它被称为“森林”,因为它通过构建大量决策树来运作(图 12)。 如前所述,决策树创建用于做出决策的规则。 随机森林将随机选择特征并进行观察,构建决策树森林,然后使用完整的树集来估计类别。 当您对训练数据没有太多了解时,这是一个很好的选择。复制并粘贴下面的代码来训练 RF 分类器 (ee.Classifier.smileRandomForest) 并将分类器应用到图像。 RF 算法需要构建树的数量作为其参数,我们将使用 50 棵树。
/// Random Forest Classifier
/
// Train RF classifier.
var RFclassifier =ee.Classifier.smileRandomForest(50).train({
features: classifierTraining,
classProperty: 'class',
inputProperties: predictionBands
});
// Classify Landsat image.
var RFclassified =landsat.select(predictionBands).classify(RFclassifier);
// Add classified image to the map.
Map.addLayer(RFclassified, classificationVis, 'RF classified');
注意,在 ee.Classifier.smileRandomForest 文档中(文档选项卡),有一个种子(随机数)参数。 设置种子可以让您在每次运行模型时准确地复制模型。 任何数字都可以作为种子。检查结果(图 13)。 此分类图像与 CART 图像有何不同? 分类是好还是坏? 根据需要放大和缩小并更改图层的透明度。 在第 1 章中。 7、您将看到基于准确性指标的更系统的方法来评估更好或更差。
图13 随机森林算法分类结果
【GEE里的完整代码链接】https://code.earthengine.google.com/b36ea0a98c587650289b4a56efc5d2a8