ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

ENVI主成分分析实战:从原理、参数到结果解读的遥感降维全指南

ENVI主成分分析实战:从原理、参数到结果解读的遥感降维全指南 ENVI做主成分分析几乎每个做遥感的人都用过但真正把它用明白的人不多。我最早接触PCA是为了给分类任务降维Landsat 8的OLI数据一次输出9个波段看着信息量很大实际相邻波段之间的相关性动不动就0.9以上数据严重冗余。后来在ENVI里跑了Forward PC Rotation输出的一堆文件让我彻底懵了——特征值文件该怎么看、每个主成分图像到底代表什么、输出位深怎么选这些问题折腾了好几天。这篇教程不打算把手册从头抄到尾只讲我在实际项目里反复验证过的东西PCA的原理怎么理解、操作流程中每个参数该怎么选、输出结果怎么解读、以及踩过的那些坑。适合刚接触ENVI和遥感数据处理的人也适合已经会操作但想搞懂为什么的同行。1. 先理解主成分分析在遥感数据里到底在算什么1.1 波段冗余多光谱数据的高相关性是绕不开的问题多光谱遥感数据的波段之间普遍存在高度相关性。以Landsat 8 OLI为例可见光波段海岸波段、蓝、绿、红之间的相关系数经常超过0.9近红外与短波红外波段之间同样如此。这意味着你在用一个9维空间描述一个其实只有三四维有效变化的数据。这种冗余带来的直接后果有三个聚类和分类算法在虚高的维度上计算效率下降决策树和随机森林等模型容易过拟合波段之间相关性高导致协方差矩阵接近奇异部分统计方法不稳定。主成分分析的价值就在于把原始波段的冗余信息压缩到少数几个主成分上后续处理的数据量小、信噪比高。1.2 PCA的坐标旋转逻辑找方差最大的方向主成分分析的计算原理其实不复杂一句话概括对原始数据做坐标旋转让新坐标系的第一轴指向方差最大的方向第二轴在与第一轴正交的平面上找方差次大的方向以此类推。具体到ENVI里发生的事情完整链路是这样的先计算各波段之间的协方差矩阵或相关系数矩阵这一步在ENVI里叫Compute Statistics然后对这个矩阵做特征值分解得到特征值和特征向量最后把原始图像每个像元的光谱向量投影到特征向量方向上得到每个主成分的图像。特征值的含义很直接它表示该主成分方向上数据方差的大小。特征值越大该主成分保留的原始信息量越多。特征向量则告诉我们每个主成分是由原始波段如何加权组合出来的。比如第三主成分的特征向量各项系数里若第5波段权重最大说明这个主成分主要由第5波段的信息主导。1.3 第一主成分为什么总是很亮回到我最初的困惑为什么PC1的图像看起来整体亮度很高、纹理模糊像一张全色图其实这正是PCA坐标旋转的必然结果。多光谱图像中所有波段共同包含的最显著变化其实是地表的整体亮度——植被、裸地、水体、城镇各自的反射率水平差异极大而这种差异在所有波段里都有体现。PCA找到的第一个方向自然会去捕捉这个整体亮度差异所以PC1图像中亮度差异主导了视觉观感地物之间的光谱细微差异反而不明显。PC2、PC3则依次捕捉剩余的主信号比如植被绿峰与近红外反射的差异归一化植被指数信号、土壤与植被的光谱差异等。越靠后的主成分包含的信号越弱到最后基本只剩传感器噪声。理解了这一点看结果时就不会把PC1误当成最有用的图像也不会一看到后几个主成分就随手扔掉。2. 跑PCA之前数据准备和两个影响结果的关键选择2.1 数据要不要先做辐射和大气校正我的经验是如果数据没有经过大气校正PCA结果的物理解释会大打折扣。未校正的DN值包含了太阳高度角、大气散射、传感器增益等系统性影响这些因素在整体图像上的变化会被PCA当成最大方差捕捉进PC1里导致PC1反映的不是地表信息而是观测条件差异。所以我一般建议做PCA之前至少完成辐射定标把DN值转换为表观反射率用于多时相分析时则建议做完整的大气校正否则各时期图像之间的辐射尺度不一致PCA计算出的协方差结构会被时相差异主导。ENVI里做大气校正的常用工具是QUAC和FLAASH前者快速但精度一般后者参数多但结果可靠。2.2 Covariance还是Correlation选错影响主成分权重分配ENVI的Forward PC Rotation参数面板里有一个下拉菜单Covariance Matrix和Correlation Matrix。这个选择直接影响主成分的结构。用协方差矩阵计算时方差大的波段天然获得更高权重。对遥感图像来说近红外波段反射率范围宽、方差大会显著影响前几个主成分的方向而某些动态范围小的波段虽然信息并不少容易被忽略。用相关系数矩阵计算时所有波段先被标准化到均值为0、方差为1再计算相关关系各波段对主成分的贡献权重更平等。如果各波段都是同一传感器、同一辐射分辨率获得的数据我习惯用协方差矩阵因为它保留了原始遥感数据的量纲和物理意义主成分图像与原始反射率值有直接对应关系。如果数据是多源融合的或者波段间动态范围差异极大建议改用相关系数矩阵。需要在两者之间做决定时分别跑一次对比特征值分布和主成分图像的区别比盲目遵循经验更靠谱。2.3 波段子集选择先剔除坏波段再分析我很早之前犯过一个错误拿着Landsat 7的SLC-off数据直接做PCA结果PC2和PC3的图像里全是条带噪声的条纹后面的主成分基本没法用。事后才意识到坏波段和噪声波段如果不先剔除它们的高方差信号会被PCA误当作重要信息保留在前几个主成分中。实操建议跑PCA之前先目视检查每个波段确认是否有条带、坏线、饱和区域。有明显问题的波段宁可舍弃。如果分析目的是提取某个特定地表参数可以根据波段相关性矩阵预筛一遍去掉与其他波段高度冗余又建模贡献不大的波段既能减少计算量也能让主成分的解释更加清晰。3. ENVI Forward PC Rotation完整操作流程3.1 工具入口与两种统计方式ENVI中主成分分析的工具入口在Toolbox工具箱中路径是Transform → Principal Components → Forward PC Rotation。点击后会弹出文件选择对话框选中你需要处理的影像。这里有两个选项计算新统计量和应用已有统计量。首次处理或数据有更新时选第一个它会先对影像全图或你指定的区域统计协方差/相关矩阵再做旋转。应用已有统计量适合大数据集当多次运行需要保持统一转换矩阵时使用前一次运行输出的统计文件可以直接加载。这里提醒一句Forward PC Rotation做的是正向旋转是从原始波段到主成分空间的变换。那个叫Inverse PC Rotation的工具是反向操作把主成分图像转回原始波段空间常用于数据压缩恢复或噪声去除验证后面会提到。3.2 参数面板逐项拆解选择完输入文件后进入Forward PC Rotation Parameters面板每个参数我都给出建议选法参数设置建议说明Stats SubsetFull Scene或根据ROI统计范围建议全图统计但超大影像可先用整幅或抽样Output Stats Filename指定文件路径会生成包含特征值和特征向量的统计文件务必保留Output Data TypeFloat或与原数据一致主成分输出值是连续浮点建议选Float避免量化误差Number of Output PC Bands选2-5个或特征值自动确定通常前几个主成分已包含绝大多数方差Stats Subset的设置容易被忽略。全图统计最稳妥但如果影像特别大全图统计内存压力大可以用Enter ROI的方式选择一个覆盖多种地物类型的区域来计算统计量。选择统计区域的原则是地物尽量均匀、多样避免只选大面积单一地物比如一半是水体否则统计出的协方差结构会严重偏向该地物主成分图像对其他地物的判别力下降。Output Data Type这点我吃亏过。第一次跑PCA选了原始数据的位深比如UInt16结果主成分图像灰度层次看起来很脏部分细节被压缩丢失。主成分输出通常是浮点数用整数位深存储会造成量化误差。建议输出时选Float单精度虽然文件体积稍大但信息保全效果更好。3.3 输出主成分数量的确定方法ENVI允许你选择输出部分主成分或全部。我建议不要一上来就选全部先跑一次生成的特征值统计文件里写着每个主成分的方差和累积贡献率。以我处理Landsat 8 9波段数据的经验前3个主成分通常能覆盖95%以上的方差高光谱数据如Hyperion 200多个波段有时需要保留10到20个主成分才能到99%。选多少个主成分核心思路是看你的下游应用需求。做分类预处理的话保留方差贡献率到99%的主成分基本足够做信号提取和异常探测反而要关注那些方差极小但空间结构特殊的主成分——它们往往对应着稀有的地物信号藏在噪声里。3.4 大数据量时的内存策略ENVI处理高光谱影像时内存消耗大。实际操作中如果内存不足导致卡死或报错可以在ENVI的Preferences里调整内存分配也可以通过输出参数指定Tile Size分块大小让ENVI分块读写文件而不是一次性载入全部数据。处理几百MB的图像通常没压力但上GB的高光谱数据建议分块处理。4. 结果解读特征值文件、PC图像和载荷输出的正确打开方式4.1 特征值文件数据里藏着保留几个主成分的答案Forward PC Rotation生成的统计文件中有一列Eigenvalues特征值和一列Cumulative Percentage累积百分比。特征值数值上等于各主成分的方差累积百分比是前N个主成分方差和占总方差的比重。这是决定保留主成分数量的核心依据。举一个我处理过的例子某区域Landsat 8影像9个波段的PCA结果PC1特征值占82.3%PC2占9.7%PC3占4.2%前三个累积96.2%后面六个主成分加起来不到4%。像这种情况保留前三个主成分做分类信息损失很小但数据量从9维降到了3维。4.2 PC图像的目视解读与波段组合推荐主成分图像需要逐一打开检查。把PC1、PC2、PC3组合成RGB假彩色显示往往能得到信息量远大于原始波段标准假彩色的合成图。PC1放红色通道、PC2放绿色、PC3放蓝色是我常用的组合方式对地物类型的区分度很高。不同主成分图像的特征也值得单独看。PC2和PC3中某些在这些方向上方差大的地物类型会显得很突出比如植被通常在PC2上与土壤有明显分离。如果你发现某个主成分的图像呈现明显的条带或探测器列噪声那通常是传感器自身问题被PCA放大了处理时应把它作为噪声主成分剔除或者用它做噪声评估。4.3 特征向量与载荷每个主成分的实际物理构成统计文件里还包含特征向量Eigenvectors它是一个矩阵每一行对应一个主成分每一列对应一个原始波段。行内的数值就是权重系数正负和大小共同决定该主成分对原始波段的依赖程度。例如某主成分在第4波段红波段上有较大的正载荷在第5波段近红外上有较大的负载荷那这个主成分本质上就是在捕捉红波段与近红外的对比变化——也就是植被信息。用特征向量矩阵能够精确回答这个主成分里到底哪个波段说了算这在做物理量反演时尤其重要。4.4 用Inverse PC Rotation做噪声压制与数据恢复前面提到Inverse PC Rotation是把主成分图像转回原始波段空间。它的典型用法是先做正向PCA→丢弃那些主要由噪声主导的尾部主成分→再反向旋转回原始波段空间。这样得到的新图像在保留绝大部分信号的同时噪声水平大幅下降。我处理高光谱数据做矿物填图时用过这个方法效果比直接在原始波段上做平滑滤波干净得多。操作路径在Transform → Principal Components → Inverse PC Rotation。注意反向旋转时需要加载正向旋转时生成的特征向量统计文件否则无法正确恢复。另外如果正向旋转时输出只保留了一部分主成分反向旋转回的空间维度也会相应减少输出波段数量少于原始输入这是正常的。5. 实战中的坑我踩过的和替别人排过的问题5.1 未做大气校正直接PCAPC1变成了光照条件图之前接手过一个林地分类项目对方直接拿Landsat 8 L1级DN数据跑了PCA发现PC1图像里山脊的阳坡特别亮、阴坡特别暗纹理拟合的是地形起伏而非植被分布分类精度上不去。本质原因是DN数据中太阳辐照度与地形的耦合信息方差远大于光谱本身的差异PCA把最大方差给了这个耦合信号。正确的做法是先转表观反射率再做大气校正和地形校正最后才做PCA。如果比较急也至少要完成辐射定标让各波段数值在同一尺度上。5.2 选择整数位深输出主成分细节丢失不可逆像前面提过的主成分图像数值是连续浮点。如果输出时选了UInt16或Byte正值溢出和负值截断都会发生。尤其PC2和更后面的主成分经常出现负值——这是坐标旋转后光谱向量落在负方向的正常结果用无符号整数存储时这些值会被强制钳位为0图像上表现为一块块死黑区域信息完全消失。不管原始数据是什么位深我都建议主成分文件输出用Float。ENVI中在参数面板Output Data Type下拉选Float即可。文件会比较大但后续无论是做分类还是目视解译数据的完整性和精度都更重要。5.3 特征值差距悬殊时主成分图像仍可能含有隐蔽信息PCA自带的降维能力容易让人形成路径依赖只保留前三个主成分后面的全扔掉。但对某些场景这并不明智。比如水体异常探测、稀有矿物识别目标地物在影像上占比极小在全局协方差中几乎没有贡献所以它们的信号会沉到很后的主成分中。我遇到过一案例一个露天矿区的水体污染识别任务前5个主成分图像都看不出异常区域但PC6和PC7的图像上氧化废水区域的信号非常突出。全局PCA降维时这部分信号因为方差占比太小被归到了尾部但它恰恰是目标信号。所以处理异常探测类任务时不要急着丢弃尾部主成分应该逐个查看再决定去留。5.4 与SARscape扩展的配合使用搜索关键词里常看到SARscape中缺GACOS模块的问题这里提一句作为同类流程的注意事项。SARscape是ENVI做InSAR处理的主流扩展GACOS是用于大气延迟校正的外部数据之一。如果你在SARscape中找不到GACOS处理工具大概率是版本里没有集成对应模块或者外部数据格式未按SARscape要求的格式整理。这种场景下可以跳过GACOS改用其他大气校正策略或者在ENVI外部准备好校正数据后再导入SARscape。它和PCA没有直接关系但都属于工具就在那里、参数环节决定成败的典型问题所以安排在整个流程的注意事项里说。5.5 什么时候PCA反而不合适PCA不是万能的。如果数据本身波段数量少、相关性低比如只有四五个波段且各波段信息相对独立PCA能带来的提升有限甚至因为强行线性组合丢失部分边缘信息。此外PCA假设数据的主要变化是线性的对呈明显非线性特征的地表要素如混合像元、BRDF效应明显的区域PCA的效果会打折扣。这种情况下后续可以考虑非线性方法比如基于核方法的扩展版本或者直接在专业软件里用流形学习类工具。理解方法本身的前提假设才知道什么时候用它、什么时候别用它。5.6 与Python端PCA实现交叉验证ENVI里的PCA计算逻辑其实可以跟Python端的sklearn实现做交叉验证。用同样的输入图像导出为TIFF在Python中用sklearn.decomposition.PCA计算主成分再和ENVI结果比较。两者选同样统计方式时主成分图像应当几乎一致只有浮点精度上的微小差异。在Python中跑PCA的时候有一点和ENVI不同sklearn默认对数据进行中心化。ENVI的Forward PC Rotation同样基于中心化后的协方差计算所以本质上一致。但注意sklearn中PCA类的whiten参数默认False不需要手动白化否则主成分结果的方差结构会被改变。想快速验证的时候用这个路径能帮你确认ENVI端参数设置是否合理。一些手里的经验分享给正在折腾的人最后补充两个细节。一是ENVI中PCA处理结果的文件命名默认会带_pc后缀如果你要跑多次试验建议每次明确指定输出文件名别让ENVI自动追加序号不然后期整理起来一堆相似文件名非常痛苦。二是关于多个主成分图像的对比显示可以在ENVI的Layer Manager中把各PC波段加载为一个RGB组合用Display功能慢慢调整拉伸方式。默认的2%线性拉伸适合快速预览做正式成果图时建议手动设置拉伸范围把PC图像的动态范围展现得更充分。PCA这个工具看起来按钮不多真正能不能用好全在对数据特性的理解和对统计结果的解读上。希望这篇文章能帮你少走一些弯路。
返回列表