☰
eCognition多尺度分割与面向对象分类:规则集与机器学习实战指南
2026/10/4 1:25:53 网站建设 项目流程

做遥感分类这些年,我手里迭代最频繁的工具就是易康eCognition 9.0,尤其是它的面向对象多尺度分割分类流程。以前我也迷信像素级算法,后来被高分辨率影像上的“椒盐噪声”折腾够了,才彻底转向基于对象的思路。这套流程里,规则集和机器学习是两条核心分类路线,但两条路线都建立在一个共同的地基上——多尺度分割。这篇文章我就把实际项目里摸出来的经验完整讲一遍,从分割参数到底层原理,从规则集调试到机器学习特征工程,最后再说说两条路线怎么结合,尽量让刚开始接触eCognition的人少走弯路。

如果你正准备做土地利用分类、地表覆盖制图、水体/建筑/植被提取,或者手里拿到了亚米级或米级的高分辨率影像,这篇文章会比较对胃口。我不会把界面按钮一个个列出来,那是软件手册的事;我更想讲清楚每个参数背后的逻辑,以及遇到问题时的排查思路。这些内容往往是我在项目上反复撞墙之后才总结出来的。

1. 先搞清楚:为什么是“对象”,而不是“像素”

1.1 像素分类的痛点:椒盐噪声与语义缺失

刚入行时我用ENVI做最大似然分类,后来又试过基于像素的随机森林。看混淆矩阵,总体精度能做到85%甚至90%,感觉很成功。但图一放大就露馅了——明明是连成片的水泥路面,结果中间突然冒出一堆绿色、蓝色的小点,整个图全是“麻子”。这就是大家常说的椒盐噪声。为什么会出现这种现象?因为像素分类器只关心单个像元的光谱值,完全不管这个像元和周围像元是什么关系。哪怕相邻两个像素光谱差异非常小,分类器也可能因为概率曲线的细微波动,把它们分到不同类别里。

另一个更深层的问题是“语义缺失”。一条宽度3米的道路,在0.5米分辨率的影像上大约占6个像素宽,你凭肉眼很容易认出来它是一条道路,因为你能看到它是连续的长条状结构、宽度基本一致、两侧大概率是植被或者建筑。但对像素分类器来说,它只看到零零散散的一堆点,根本没有“形状”“上下文”这些概念,自然很难把这条路完整地提出来。

1.2 影像对象到底是什么:一个可以“讲道理”的单位

eCognition的解法是把相邻且相似的像素合并成一个个“影像对象”(Image Object)。你可以把它理解成把乐高小颗粒拼成了大积木块,后续所有分析都基于这些积木块展开。一个影像对象有自己的平均光谱、面积、长宽比、纹理特征,还能知道自己的邻居是谁、自己是不是被水包围的岛等等。这样一来,分类器面对的不再是几十万个孤立的像素,而是几千个有完整语义的对象,信息密度一下子高了很多。

有一点我看到不少新人会绕晕——面向对象里的“对象”,指的不是Java、C++里那个“对象”,而是“影像对象”。当然你可以用面向对象的编程思想来理解它:每个影像对象都是一组属性和方法的封装体。但在eCognition里,你不写代码也能直接操作这些对象,所以重点还是放在“对象承载了光谱、形状、纹理、上下文关系”这件事上。

1.3 面向对象分析(OBIA)真正擅长的场景

面向对象分析最适合高分辨率影像,因为地物细节丰富,单个像元难以承载语义。比如GF-2、WorldView、无人机正射影像这类数据,分辨率通常在2米以内,每个地物都由大量像元构成,对象化之后优势非常明显。对于30米分辨率的Landsat这种中等分辨率数据,如果只是做大尺度的植被指数分析,像素分类和对象分类的差距就没那么大;但如果你想区分不同森林类型、或者做复杂破碎地表的分类,对象化依然能带来收益。

我在项目里见过一个很典型的例子:两块相邻农田,一块种的是玉米,一块种的是大豆。像素级分类器经常把两种作物的光谱混在一团,而对象化之后,每块农田变成一个或几个完整对象,纹理特征、光谱均值和邻域关系一起参与判断,区分度明显提升。这就是面向对象的核心价值——它让分类器有更多维度的依据可以用。

2. 多尺度分割:所有分类的地基

2.1 多尺度分割在做什么

面向对象分析的第一步,通常就是多尺度分割(Multiresolution Segmentation)。这个算法的核心思想是自下而上的区域生长:从一个像元开始,不断把光谱相似、空间相邻的像元合并进同一个对象,直到合并后对象的异质性超过设定阈值才停下来。阈值对应一个核心参数——尺度(Scale Parameter)。

这个尺度参数非常直观:尺度越大,对象允许的异质性越大,生成的图斑就越大;尺度越小,图斑越碎。很多刚上手的人容易把“尺度”当成一个分辨率的概念,其实它更准确的理解是“允许对象内部差异的上限”。就好比筛子,孔径越大,漏过去的颗粒越粗,筛出来的块越大。

2.2 分割参数拆解:尺度、形状、紧致度

分割过程中,到底什么能合并、什么不能合并,核心由两股力量博弈:光谱异质性和形状异质性。eCognition里对应了三个主要参数:

参数取值范围作用我常用的初始值
Scale(尺度)正数,越大对象越大控制对象整体大小根据影像分辨率从30开始试
Shape(形状权重)0到1,越大越看重形状在光谱相似度和形状相似度之间做权衡0.1到0.3
Compactness(紧致度)0到1影响对象边界的紧凑程度0.5

Shape权重特别值得说。如果你把Shape设成0,分割时完全只看光谱差异,对象边界会很贴合光谱变化,但形状可能又碎又杂;把Shape调高,分割会优先考虑让对象形状规整,但代价是可能把光谱差异比较大的区域也硬揉进来。我的经验是,对于房屋、道路这类人工地物占主导的场景,Shape可以稍微调到0.3左右,能减少碎斑;对于森林、农田这类自然边界不规则的场景,Shape保持0.1就够了,优先让光谱说话。

紧致度则更多是“审美调节”。Compactness接近1,对象会更紧凑,接近圆形;接近0,对象边界会拉得比较开。如果你想提取建筑物,可以把紧致度适当调低一点,让对象更好地贴合建筑物直角轮廓;如果提取的是湖泊或圆形林地,紧致度可以适当调高。当然,它和Shape一样,不是越大越好,我一般不会让Shape和Compactness的总权重占据明显优势,否则会牺牲光谱纯度。

2.3 尺度参数怎么试:一组实测对比

分割参数没有绝对标准答案,必须针对影像实际情况来调。但新手最容易犯的错,是拿一幅全图直接跑一次分割,看一眼结果就开始做分类。我的建议是:先裁剪出一块包含典型地物的小范围测试区,用不同尺度分别跑分割,逐个对比。

以我做过的一个0.5米分辨率无人机影像项目为例,我分别在Scale=15、30、60、100下测试。Scale=15时,对象非常细碎,一栋建筑的屋顶被拆成了二三十个对象,边缘出现了大量细小图斑,这属于明显的过分割;Scale=30时,建筑、道路、树冠基本能完整落在同一个对象里,边界也能贴合地物轮廓,效果最好;Scale=60时,相邻的建筑和阴影开始被合并进同一个对象里,对象内部已经有明显的光谱混杂;Scale=100时,整片城区和不透水面都快糊成一块了,完全没法用来做精细分类。

Scale取值对象大小目视效果是否推荐
15很小,过碎建筑被切碎,出现大量碎斑不推荐用于建筑提取
30适中边界贴合地物,屋顶、道路基本完整最推荐作为起点
60偏大建筑与阴影开始粘连,地物混杂不推荐精细分类
100很大,欠分割多种地物合并,语义混乱仅适合大范围粗分

如果你不想靠肉眼反复试,可以用ESP(Estimation of Scale Parameter)工具辅助。这个工具的核心思路是:分割尺度的局部方差(LV)在尺度变化时会有一个拐点,拐点对应的尺度往往就是对象从“内部同质”切换到“开始混杂”的临界值。把LV曲线拉出来看,曲线突然转折的那个位置附近,通常就是适合当前影像的初始尺度。不过我实际操作中还是会更依赖目视检查,因为ESP只能提供候选,最终还得结合地物类型来定。

2.4 分割结果质量怎么看

分割完不要急着欣喜,先做三件事。第一,把分割图层叠加到原始影像上,透明度调到50%左右,看对象边界是否贴合真实地物轮廓;第二,放大到几栋建筑、一块林地、几条道路的区域,检查这些典型地物是否各自落在独立对象里;第三,点击几个对象检查它们的内部光谱方差,如果对象内部同时包含深色阴影和亮色屋顶,说明这个尺度下对象已经过度合并了。

分割完成后,对象边界一旦确定,后面分类的准确率上限就已经被锁定了。分割做得烂,后面规则集写得再漂亮、机器学习模型调得再好,都是空中楼阁。这是我认为整个面向对象流程里最重要的一步。

3. 规则集分类:把专业知识翻译成判断条件

3.1 规则集的本质是一棵决策树

规则集(Ruleset)是eCognition里最经典的分类方式。它的本质是把你对地物的理解,逐步编码成“如果……那么……”的判断规则。比如你要提取水体,你心里知道水体在近红外波段反射率很低、NDWI值偏高、形状往往比较光滑、面积通常不会太小。规则集就是把这些知识一条条列出来,让软件按顺序执行。

规则集在eCognition里表现为一个过程树。你可以在根节点下创建子规则,让不同的判断分支并行或串行执行。有一点需要特别注意:规则是有逻辑顺序的,先执行的规则会改变后执行时的上下文。比如你先用NDWI>0.1提取出水体,那么当后续规则再去判断“与水体相邻的对象”时,它看到的就是已经分类好的对象集合。合理利用这个顺序,能写出非常强大的规则,但也容易因为顺序搞错导致结果失控。

3.2 特征库怎么选:光谱、形状、纹理、上下文

规则集的原材料是特征(Features)。eCognition的特征库非常庞大,常被我用到的可以归成四类:

  • 光谱特征:波段均值、标准差、亮度、各波段的比值关系,还有归一化指数如NDVI、NDWI。这是最基础也是最稳定的特征。
  • 形状特征:面积、周长、长宽比、形状指数(Shape Index,越接近1越接近正方形)、边界指数(Border Index)、密度。这类特征对区分建筑物、道路、水域很有用。
  • 纹理特征:GLCM同质性、GLCM对比度、GLCM熵等。主要用来区分光谱相似但纹理不同的对象,比如林地与草地、农田与裸土。
  • 上下文与类关系特征:与相邻对象的关系、与父对象或子对象的关系、到指定类别的距离等。这类特征经常能解决“光谱长得差不多但位置关系完全不同”的问题。

特征不是越多越好。规则集越简洁,越好调试、越好迁移到新影像。我见过有人一个规则集里堆了四五十个条件,结果只要换一景影像,整棵规则树就崩溃。合理的做法是每个类别的判断条件控制在3到6个特征以内,而且尽量选有物理意义、不容易受光照波动影响的特征。

3.3 一个水体提取规则集的完整拆解

拿一个我实际写过的水体提取规则集来举例。我当时的流程分了三步。

第一步,分割。用多尺度分割得到对象层,然后用光谱差异分割(Spectral Difference Segmentation)把过碎的对象合并掉。为什么加这一步?因为水体在清澈水库里光谱非常均一,但分割时水面波纹可能导致一个小对象被切成很多片,光谱差异分割可以把它们重新拼起来。

第二步,在规则集里写一个assign class节点,把满足条件的对象先粗分为水体候选:

if NDWI > 0.15 and Mean Layer 4 < 200 then 水体候选

这个判断里NDWI负责把水体信号顶起来,近红外均值做二次确认,降低山体阴影被误判成水的概率。

第三步,对水体候选做细分和修正。用面积和形状规则把误判的细小阴影剔除:

if 面积 < 500 m2 and 长宽比 < 3 then 非水体

当时实际跑下来,这个规则集在山体阴影严重的区域还是有接近一成的误判。后来我加了上下文规则:只有与已确认水体相邻、且光谱差异小于指定阈值的水体候选才保留为水体。这个小小的改动,一下子把精度拉到了95%以上。这就是规则集比纯机器学习的优势——你可以把“水体是连通的”这种常识直接写成规则。

3.4 规则集调试技巧:特征空间优化与分离度

写规则集最痛苦的事情,就是某个类别的特征阈值定不准。比如NDVI到底取0.2还是0.3,你肉眼在图上看到两类地物分得很开,但阈值就是怎么试都不对。

我比较推荐先利用样本算分离度。方法是先对每个类别采集一些代表性对象样本,然后用特征空间优化工具或分离度矩阵,让软件自动计算哪些特征组合能把样本分得最开。它本质上是穷举特征组合,计算不同组合下的分离度指标,最后输出一张排序表。你会惊喜地发现,原本你以为最好用的NDVI可能不是第一位的,反而是某个纹理特征或者形状特征贡献更大。

另外一个调试技巧是灵活使用对象查看器(Object Viewer)。分类完成后再点开某个误分对象,直接查看它的所有特征值,把它和正确类别对象的特征值做对比,很快就能找出差异最大的特征。这个操作在电子表格里做也行,但eCognition里直接看更直观。

4. 机器学习分类:让模型自己学规律

4.1 为什么面向对象框架下还要机器学习

规则集虽然可解释性强,但有两个致命伤。第一,阈值是人工拍脑袋定的,很难在复杂场景里把所有组合照顾周全;第二,场景一换,规则集往往需要重新调参,维护成本高。所以我在很多项目里会换一条路线——基于分割后的对象,用机器学习分类器来做分类。

机器学习的思路是:分割完成后,把每个对象的特征(光谱均值、纹理、形状、指数等)提取出来,构成一个特征向量。然后你给一部分对象打上类别标签,比如“建筑”“水体”“植被”“道路”,让分类器从这些带标签样本里学习特征和类别之间的映射关系。这就像一个从没见过猫的小孩,你反复指着图片告诉他“这是猫”,他慢慢就学会了认猫。

4.2 特征工程:把分割结果变成模型吃得懂的数字

很多人在eCognition里跑机器学习,最容易犯的错是不做特征筛选,一股脑把所有特征全扔给分类器。特征数量越多,模型需要拟合的维度就越高,训练样本没跟上就很容易过拟合。我自己的经验是,同一类特征只要选一两个代表就行。

以GLCM纹理特征为例,eCognition里能算出一大串:同质性、对比度、相异性、熵、角二阶矩、相关性……这些特征很多彼此高度相关。我会优先保留同质性和对比度,这两个对区分植被、建筑、道路比较有效。形状特征方面,常用的就是面积、长宽比、形状指数、边界指数。光谱特征方面,各波段的均值、标准差和两个关键指数就够了。

我做过一个实验:同样用随机森林分类,特征从60个精简到25个之后,总体精度反而从88.4%升到了90.1%,训练时间也缩短了接近一半。这就是特征冗余直接拖后腿的例子。精简特征之后还有个附带好处——模型更稳,换到相邻区域的影像上,精度掉得没那么狠。

4.3 样本标注与分类器选择:随机森林实测

样本质量直接决定模型上限。在eCognition里,你需要先在分割结果上手动选择代表性对象作为训练样本。三个要求:每个类别样本量至少够用(我一般每类不少于100到150个);样本分布要覆盖影像不同区域,不能只从一小块地方采;同类别内要包含边界场景的样本,比如水体要涵盖清澈与浑浊两种状态。

分类器方面,我实测下来最稳的是随机森林(在eCognition里对应Random Trees)。随机森林鲁棒、对特征缩放不敏感、不容易过拟合,而且它能输出特征重要性,用来辅助特征删减非常方便。SVM理论上精度也可以,但它对参数和核函数更敏感,调起来费时,样本量大了之后训练速度也明显慢。KNN最直观,但对高维特征和样本分布很敏感,结果稳定性略差。

我在某个0.8米分辨率影像上做过对比,用的样本每类200个左右,特征25个。随机森林总体精度90.2%,Kappa系数0.87;SVM总体精度88.5%,Kappa 0.85;KNN总体精度85.9%,Kappa 0.82。所以只要不是特殊需求,我默认先跑随机森林。

4.4 精度评价:别只看训练集,要看泛化能力

机器学习分类跑完,不能只看训练集里的混淆矩阵就收工。训练集精度高不代表模型真学会了,它可能只是把样本背下来了。真正的检验是用一个独立验证集——也就是模型训练时从没见过的样本,来评估精度。这就是机器学期课里常说的“泛化能力”,放在你的数据上就是一个朴素的道理:训练精度高、验证精度低,说明过拟合了,需要减少特征、增加样本或者简化模型。

eCognition里可以直接生成分类结果的混淆矩阵、总体精度、Kappa系数和各类别的制图精度与用户精度。验证样本一定要单独采集,不能和训练样本混在一起。我经常看到有人随手用刚才训练用的样本再验证一遍,然后报出99%的精度,这种数字没有任何参考价值。正确做法是训练区选一块,验证区选完全独立的另一块,或者把样本按7比3拆开,用30%没参加训练的对象做验证。

另外,样本不均衡问题也要重视。比如整体影像里水体只占不到5%,但训练样本里水体占了40%,模型会拼命去拟合水体特征,结果把大量植被误分成水体。解决办法是控制每类样本数量基本均衡,或者在分类后处理阶段再加约束。

5. 规则集和机器学习怎么选、怎么混

5.1 三条路线对比:精度、效率、可迁移性

规则集、机器学习、以及规则集加机器学习的混合方案,我都有实际应用。整理成表格给你参考:

维度规则集机器学习混合方案
分类精度依赖经验和调试,上限高但方差大样本质量够时比较稳定通常最高
可解释性高,每条规则都能讲清原因黑盒,难以解释具体判断中高
样本需求基本不需要训练样本需要大量高质量样本需要样本但量可少一些
迁移性换影像后常需重新调阈值换区域后若训练数据有代表性仍可用相对最灵活
调试门槛需要地学知识,写规则耗时需要懂特征和分类器,但门槛不高高,两条路线都要懂

一句话总结:如果项目周期短、地物类别少、场景简单,直接用规则集;如果地物复杂、类别多、样本容易获取,用机器学习;如果追求高精度且有你愿意投入时间调优,混合方案是终极答案。

5.2 混合方案:先用机器学习粗分,再用规则集精修

我现在最常见的做法,是先跑随机森林做一次初分类,把复杂的地物大类先分开,然后针对容易混的类别写规则集做精细化处理。

举个例子,一个城区土地利用项目里,阴影和不透水面在全色波段上光谱很接近,随机森林把近三成阴影错分成了不透水面。我没有去反复调整样本和模型,而是直接写了一条规则:所有被分为不透水面的对象,如果亮度均值低于整幅影像不透水面亮度均值的0.8倍,而且相邻对象中有大量高植被覆盖对象,就重新划入阴影类。这个规则加入之后,不透水面的用户精度从78%直接跳到了90%。这个过程就体现了“机器学习负责大面上的区分,规则集负责解决领域知识中的特例”。

混合方案对样本量和调试时间的压力也比纯机器学习小。因为粗分类阶段的机器学习模型不需要把每个细节都学对,更细的纠错可以通过规则来处理;同时规则也不需要写得面面俱到,因为大问题已经被机器学习解决了。

5.3 批量处理与工程化:项目落地时还要想的事

到了项目真正落地,还有两个问题要提前考虑。第一是批量处理多期影像。如果你要处理同一地区不同月份的十几景影像,手动一个一个跑就不现实了。eCognition支持把规则集或分类流程保存成模板,再通过批处理模式统一执行;也可以用Python按面向对象的方式封装一个处理流程,把分割、分类、导出全部串起来,一行命令跑完一整批。

第二是成果导出。分类完成后,我一般会先把结果导出成Shapefile或GeoPackage,再到GIS软件里做后处理——比如把面积小于某个阈值的碎斑合并掉,或者用ArcGIS的消除工具把孤立小图斑合并到相邻大类里。eCognition里的分类结果也可以直接输出为栅格,但矢量形态保留的对象边界信息更完整,后续编辑也更灵活。

6. 常见问题与避坑实录

6.1 过分割与欠分割:现象、原因、处置

过分割最典型的现象:一栋建筑被拆成几十块,一条路断成一节一节。原因基本就是尺度设得太小,或者Shape权重太低导致对象边界过于细碎。处理办法是先增大Scale,再把Shape权重适当调高,最后可以用光谱差异分割把碎斑合并。

欠分割的现象反过来:一栋建筑和它的阴影变成一个对象,或者一块林地和旁边的草地糊在一起。处理办法是降低Scale,或降低Shape权重让光谱差异起更大作用。我在实际项目里,通常不会只调一个参数,而是用“Scale + Shape + Compactness”三个参数联动调整,每次只改一个变量、对比结果,逐步逼近最佳配置。

6.2 规则集换一幅影像就崩溃

这是规则集最让人头疼的问题。原因往往是阈值定得太绝对,没有考虑不同时期影像的光照、大气条件、物候差异。解决思路有三个。第一,尽量使用比值型特征,比如NDVI、NDWI,它们能抵消一部分绝对辐射差异;第二,把所有阈值写成变量参数,放到规则集最前面统一管理,换影像时只需要调几个全局变量;第三,把规则集设计成分层结构,先做大数据范围的粗分类,再逐层细化,避免一上来就卡死在非常具体的阈值上。

6.3 机器学习结果出现大量碎斑

这种碎片化问题和分割参数有关,也可能和分类器本身有关。一种常见做法是在分类完成后做一个“分类后合并”步骤,把相邻且类别相同的对象合并起来;再用“移除对象”工具,把面积小于指定阈值的对象重新划归到它最大邻居的类别里。这相当于在结果层面做了空间平滑,视觉上会干净很多,但要注意,如果阈值设得太大,可能把一些真实的小地物,例如小水塘、小建筑,也一并抹掉了,所以阈值宁可设得保守一些。

6.4 数据格式、投影与内存问题

eCognition对数据格式比较挑,不认乱七八糟的投影。我踩过的坑是:影像坐标系和后续要叠加的矢量边界坐标系不一致,导致分割和分类结果在导出后对不上位置。这个很好解决,所有数据在进eCognition之前先统一投影。内存不足是大影像作业的常见问题,尤其是大范围无人机正射影像,动辄几十GB。我的经验是先用切块工具把影像按图幅切成分块,每块单独跑完流程之后再拼接成果;如果有条件,准备一台内存充足的工作站会省很多心。

6.5 一个容易被忽略的点:预处理

最后我还想提醒一下影像预处理。分割对图像质量很敏感,云雾遮挡、传感器坏线、拼接接缝处颜色跳变,都会直接影响分割边界。所以进eCognition前,先做好辐射定标、大气校正和匀色镶嵌,能让后面的分割轻松很多。不要指望eCognition能替你完美处理输入数据,前面省事,后面全是坑。

我个人现在接手一个新项目,第一步永远是先花时间把分割参数调到位。分割不好,后面规则集和机器学习都是空中楼阁。如果你也是从像素分类转过来,建议先别急着跑分类器,用一块小测试区把多尺度分割玩明白了再动手,后面会顺很多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询