简介:这份ENVI遥感影像处理实验报告面向地信、遥感及相关专业学生与初学者,围绕Landsat8多光谱影像的系统处理流程展开,可用于课程实习参考、实验报告撰写借鉴与操作复盘。资源包仅含1个docx文档,大小约7.92MB,正文以文字配截图和结果图的方式组织,按实验目的、数据概况、图像裁剪、辐射定标与反射率计算、大气校正比较、图像融合、水体提取与植被覆盖度、温度反演、监督/非监督分类及土地利用变化等模块递进说明。其中融合部分涵盖Brovey、HSV、主成分变换及定性与定量对比,温度反演涉及大气校正法和单窗算法,便于读者理解参数设置、处理步骤与结果判读之间的对应关系,文末还附实习心得体会。该资料已有1245人学习,适合需要一套完整流程样例和结果对照的遥感实习场景。
1. 为什么一份遥感实习报告值得拆开看
带过几轮地信和遥感方向的实习之后,我发现一个规律:软件操作表谁都能背,真正卡人的是参数怎么填、填错之后影像会变成什么样。这份 ENVI 处理 Landsat 8 的实习报告,从头到尾串起了波段组合、矢量裁剪、辐射定标、FLAASH 大气校正、全色融合、水体与植被覆盖度提取、温度反演、非监督与监督分类、土地利用变化监测这条完整链路,每个环节都配了参数界面和结果图。它适合两类人:一类是第一次上手 ENVI、需要照着跑一遍的地信遥感学生,另一类是按钮都会点、但说不清为什么这么点、结果不对时不知道往哪查的从业者。下面按我自己复现这套流程的顺序拆。
2. 波段组合与裁剪:把研究区钉在同一套像元网格上
Landsat 8 一景数据解压出来是一堆独立 TIF,外加一个 MTL 头文件。很多人拿到手第一反应是直接双击打开最大那个,然后在显示窗口里乱点。这套流程的第一步恰恰不能这么干,因为它后面所有参数——中心波长、增益偏置、FLAASH 的波段对应关系——都依赖「第几个波段是什么」这个顺序。顺序定死之前,任何一步都不能往下走。
2.1 Layer Stacking 的波段顺序为什么必须在第一步定死
ENVI 的 Layer Stacking 本质是把若干单波段栅格按你给的顺序拼成一个多波段文件。拼完之后,ENVI 只记得「波段 1、波段 2……」,不记得它原来是 Coastal aerosol 还是 Blue。后面在 Edit Header 里填中心波长时,你填的第 1 个值就会落到波段 1 上。一旦 Layer Stacking 的顺序乱了,波长和实际光谱就对不上,FLAASH 会拿着错误的光谱响应去解算大气参数,出来的反射率整体偏色,而且这种偏色是系统性的,你换多少个气溶胶模型都救不回来。
我一般按下面这个顺序做:
File → Open打开解压目录,只选 B1 到 B8 这 8 个 TIF,BQA、B9、B10、B11 全部不要选。Basic Tools → Layer Stacking,在Import File里逐个加入,加完点Reorder Files,确认列表从上到下是 B1、B2、B3、B4、B5、B6、B7、B8。- 输出文件名带上传感器和日期,比如
LS8_2019_stack.dat,输出格式保持 ENVI 标准,OK。
这里有两个容易被忽略的点。B8 是全色波段,空间分辨率 15 米,和其余 30 米波段放在一起时,Layer Stacking 会把它重采样到 30 米;这一步不影响后续融合,因为融合工具会自己再处理,但如果你打算用 B8 单独做锐化,最好把它单独另存一份 15 米的。B10 和 B11 是热红外,原始分辨率 100 米,绝对不能混进这个栈里——一旦混进去,ENVI 会按主波段分辨率统一重采样,热红外的原始像元被插值放大,后面温度反演算出来的亮温是假的,而且从结果图上完全看不出来。
还有一种情况:手上是 L1TP 产品,MTL 里已经写好了各波段的RADIANCE_MULT_BAND_x和RADIANCE_ADD_BAND_x,但 Layer Stacking 不回读这些系数。这意味着组合完的文件仍然是个「裸」的 DN 值文件,必须手动在头文件里补波长和增益偏置,否则下一步辐射定标没得做。
2.2 矢量范围裁剪:ArcGIS 和 ENVI 两条路怎么选
研究区边界给的是一个 shp,里面可能包含好几个行政区。原报告的做法是先在一个桌面 GIS 里筛出目标县、导出成独立 shapefile,再拿进 ENVI 裁剪。这条路稳妥,但多做了一步数据搬运。ENVI 自己也能直接吃 shp,而且能把矢量转成 ROI 留在内存里,后面做掩膜、选训练样本都能复用。
桌面 GIS 那条路的操作是:加载 shp → 打开属性表 → 按字段筛选目标行政区 → 右键图层Data → Export Data导出新 shapefile → 用Clip(Data Management → Clip)或Extract by Mask裁影像。优点是投影转换、批量裁剪、多景统一处理都方便,缺点是裁完的影像和矢量在 ENVI 里还得重新对齐一次。
ENVI 那条路的操作更短,但每一步的勾选项都不能错:
File → Open Vector File打开 shp,在 Layer Manager 里能看到这个矢量图层。- 右键该图层 →
Export Active Layer to ROIs,选第一个选项,把整个矢量范围转成一个 ROI。 Basic Tools → Subset Data via ROIs,Select Input File选组合好的多波段文件,Select ROI or EVF选刚生成的 ROI。- 关键两项:
Mask pixels outside of ROI设为Yes,Mask Background Value设成0;Pixel Subset选No,不要额外做行列裁剪。
Mask Background Value这个参数值得单独说。它决定了裁剪范围之外的像元填什么值。填 0 最省事,但如果研究区里本身就有反射率接近 0 的地物(深水体、阴影),后续做统计或者掩膜时,背景和真实地物会混在一起,算出来的均值、面积全是错的。我的习惯是填-999,或者在后续统计前先用Build Mask把 0 值区域单独排除掉。
两条路线怎么选,我一般按这个标准:只处理一两景、后面还要在 ENVI 里做分类和统计的,走 ENVI 路线,ROI 能一直复用;要批量处理十几景、或者需要先做投影转换和坐标统一的,走桌面 GIS 路线,脚本化更省事。
| 对比项 | 桌面 GIS 裁剪 | ENVI 矢量转 ROI 裁剪 |
|---|---|---|
| 投影处理 | 支持重投影、批量 | 依赖原数据投影,不转换 |
| 后续复用 | 需重新导入矢量 | ROI 常驻,可直接选样本 |
| 背景值控制 | 工具参数里设 | Mask Background Value显式指定 |
| 适用规模 | 多景批处理 | 单景精细分析 |
2.3 裁剪完先回查三项元数据
裁剪这个动作看起来无害,实际上它可能悄悄改掉三样东西,而这三样都会在后面某一步爆出来。第一是投影和基准面,如果原始数据是 UTM/WGS-84,裁完之后要确认没有被改成地理坐标(经纬度),否则像元大小从 30 米变成零点几度,温度反演里所有跟面积、距离相关的换算全崩。第二是像元大小,正常的 Subset 不会重采样,但如果你在Pixel Subset里手滑填了行列数,ENVI 会做一次重采样,30 米可能变成 30.0001 这种诡异值。第三是波段数和波长信息,裁剪不会丢波段,但如果你是用Save As另存而不是 Subset,头文件里的波长字段有可能被清空。
回查的方式很简单:右键文件 →View Metadata,看Map Info里的投影字符串和Pixel Size,再看Wavelength那一栏是不是还有 8 个值。这一步花不了一分钟,但能省掉后面几个小时的返工。
3. 辐射定标与 FLAASH:DN 值到地表反射率的全链路
从 DN 值到能用的地表反射率,中间隔着两步:先把 DN 按传感器系数换算成辐亮度,再让 FLAASH 把大气的影响剥掉。这两步的参数来源都是同一个 MTL 头文件,所以第一步不是打开 ENVI,是打开那个 txt 文件,把该抄的数抄下来。
3.1 Edit Header:中心波长、增益偏置、单位三件套
Landsat 8 OLI 各波段的中心波长在 MTL 里没有直接给,得按波段范围取中值,或者直接查产品文档。常用的 8 个值如下,单位是微米:
| 波段 | 名称 | 中心波长(µm) |
|---|---|---|
| B1 | Coastal aerosol | 0.443 |
| B2 | Blue | 0.482 |
| B3 | Green | 0.561 |
| B4 | Red | 0.655 |
| B5 | NIR | 0.865 |
| B6 | SWIR1 | 1.609 |
| B7 | SWIR2 | 2.201 |
| B8 | Pan | 0.590 |
填的时候注意 ENVI 默认单位可能是纳米,必须在对话框下方把单位切到Micrometers,否则 0.443 会被当成 0.443 纳米,FLAASH 拿到这个数会直接报波长范围错误。填完不要急着关,把 8 个值从头到尾扫一遍,确认没有错位——这是最容易出错的地方,因为对话框里只有一串数字,没有波段名提示。
增益偏置从 MTL 里读,格式是RADIANCE_MULT_BAND_1 = 1.2xxxxE-02和RADIANCE_ADD_BAND_1 = -6.xxxxxE-02这样的两行,B1 到 B7 各一组。ENVI 扩展工具里的Apply Gain and Offset就是干这个的:打开裁剪好的文件,按波段逐个填 gain(对应 MULT)和 offset(对应 ADD),输出类型选浮点。得到的结果单位是 W/(m²·sr·µm),也就是辐亮度,不是反射率,这一步还没完。
如果你手上是 ENVI 5.3 及以上版本,Radiometric Calibration工具能一步出表观反射率,省掉手动填系数的麻烦。但原报告走的是手动 Gain and Offset 这条路,好处是每一步的物理量都清楚,坏处是 8 个波段填 16 个数,错一个就整体偏。填完之后我一般会抽查一下:水体在 B5 的辐亮度应该明显低于 B4,如果反了,说明增益填串了波段。
3.2 BSQ 转 BIL 与 FLAASH 参数逐项配置
FLAASH 只吃 BIL 或 BIP 交错格式,ENVI 默认输出 BSQ,所以要转一次:Basic Tools → Convert Interleave → BIL,选辐射定标结果,输出即可。这一步没有参数,但别跳过,直接拿 BSQ 喂给 FLAASH 会报格式不匹配。
然后打开Spectral → FLAASH,参数界面分三块。第一块是输入输出和几何信息,第二块是大气与气溶胶,第三块是多光谱波段设置。逐项说:
| 参数 | 取值 | 说明 |
|---|---|---|
| Input Radiance Image | BIL 辐射定标文件 | 必须转成 BIL |
| Output Reflectance File | 自定义路径 | 输出为浮点反射率 |
| Scene Center Location | 自动填充 | 读自头文件经纬度 |
| Sensor Type | Landsat-8 OLI | 选错会套错光谱响应函数 |
| Sensor Altitude | 705 km | OLI 轨道高度 |
| Pixel Size | 30 m | 与裁剪后一致 |
| Ground Elevation | 0.97 km | 研究区平均海拔,需自行查证 |
| Flight Date | 影像获取日期 | 不是文件生成日期 |
| Flight Time GMT | 格林尼治时间 | 由SCENE_CENTER_TIME换算 |
| Atmospheric Model | MLS(中纬度夏季) | 按纬度和季节选 |
| Water Retrieval | No | OLI 无专用水汽吸收波段 |
| Aerosol Model | Urban | 县域城区占比低时可试 Rural |
| Aerosol Retrieval | 2-Band (K-T) | 双波段反演气溶胶光学厚度 |
| Initial Visibility | 40 km | 反演失败时的兜底值 |
时间这一项是重灾区。MTL 里有两个时间字段,一个是DATE_ACQUIRED(成像日期),另一个是文件生成时间(产品处理时间),后者通常比前者晚几天甚至几周。FLAASH 用成像时间算太阳天顶角和方位角,填错的话反射率整体偏暗,而且这种偏差是均匀的,从单张图上完全看不出来,只有和标准地物光谱比对才会暴露。换算 GMT 时注意SCENE_CENTER_TIME一般带时区后缀,直接取时分秒部分按 UTC 处理,不要自己加减 8 小时。
高程那一项也不能偷懒。原报告是查了研究区平均海拔填 0.97 km,这个值影响大气上行辐射的估算,填 0 会让低海拔地区的反射率被高估。如果研究区高差超过 500 米,严格来说要做分区校正,但实习级别用平均值够用。
多光谱设置那块,点开Multispectral Settings,选Kaufman-Tanre Aerosol Retrieval,然后在下面的波段选择框里指定两个波段:短波红外选 B7(2.2 µm),红光选 B4(0.66 µm),这是 K-T 方法的标准搭配。有些资料会写成选 B1,照抄的话反演出来的气溶胶光学厚度会偏,最后反射率整体偏蓝。光谱重采样宽度保持默认 10 nm。
3.3 校正结果怎么验证:Z-Profile 与三类地物
大气校正做完不能只看「图好不好看」,因为 FLAASH 输出的反射率是浮点,直接显示会自动拉伸,看起来都差不多。真正有效的是抽几条光谱曲线对比。
操作是Spectral → Z Profile,在同一个像元位置上分别加载原图、辐射定标结果、大气校正结果,看三条曲线。判断标准有三条:
- 植被:红光波段(B4)应该是一个明显的吸收谷,近红外(B5)是反射峰,峰谷差越大越好。校正后 B5 的反射率正常在 0.25 到 0.5 之间。
- 水体:可见光区反射率低于 0.1,近红外接近 0,曲线整体平滑下沉。
- 裸土:从可见光到短波红外单调上升,没有明显吸收特征。
如果植被的 B5 反射率低于 0.2,八成是气溶胶模型或者能见度设错了;如果整条曲线在短波红外被压得很低,检查一下 B7 有没有被误当成水汽波段参与反演。
4. 融合与专题提取:从全色锐化到地表温度
融合这一步是整个流程里方法最多、结论最不统一的地方。同一个研究区,Brovey、HSV、PC 三种变换出来的图,目视效果能差出一大截,定量指标又各说各话。原因不全是算法本身,很多是量纲没对齐、评价口径不一致造成的假差异。
4.1 全色波段的量纲对齐
大气校正之后,多光谱和全色波段的反射率都在 0 到 1 之间,但 ENVI 的融合工具内部对输入数据的动态范围有假设,如果直接拿 0 到 1 的浮点去融合,输出经常是一片灰。原报告的做法是先对 B8 做一次反射率拉伸,把它的数值范围拉开。
我一般用Basic Tools → Stretch Data,输入 B8,拉伸方式选Linear 2%,输出数据类型选Byte,得到 0 到 255 的全色波段。多光谱那边保持浮点或者同样拉到 0 到 255,关键是两边量纲要一致。这一步看起来是预处理的小动作,实际上决定了融合结果能不能用——量纲不统一的融合图,目视可能还行,一算标准差就露馅。
4.2 Brovey、HSV、PC 三种变换的操作差异
三种方法在 ENVI 里都在Transform → Image Sharpening下面,但输入要求不一样,这是最容易卡住的地方。
Brovey 只吃 RGB 三波段。操作路径是Transform → Image Sharpening → Brovey,Select Low Res Input选多光谱的 B5、B4、B3(或者 B4、B3、B2),Select High Res Input选拉伸后的 B8,重采样方式选Nearest Neighbor。最近邻能保住原始像元值不被插值污染,代价是边缘有锯齿。Brovey 的数学过程是每个彩色波段乘以「高分辨率波段 / 三波段之和」这个比值,所以它对高分辨率波段的动态范围很敏感,B8 没拉伸好,结果就整体偏暗。
HSV 同样要 RGB 输入,路径是Transform → Image Sharpening → HSV。它先把 RGB 转到 HSV 色彩空间,用高分辨率波段替换亮度 V,色度和饱和度重采样到高分辨率尺寸,再转回 RGB。这个变换的问题是色相和饱和度也被一起重采样了,光谱保真度不如 Brovey,但目视锐度通常更好,尤其建筑和道路边界更清楚。
PC 变换的路径是Transform → Image Sharpening → Principal Components。它先对多光谱做主成分变换,把第一主成分(信息量最大、也是亮度信息最集中的那个)替换成匹配过高分辨率波段,再做逆变换。PC 的好处是没有波段数限制,坏处是第一主成分承载了大部分光谱信息,替换之后色调变化明显,原报告里 PC 融合的目视效果最差,颜色发艳、细节反而糊,这和它第一主成分被整体换掉有直接关系。
三种方法的特性对比如下:
| 方法 | 输入限制 | 光谱保真 | 空间增强 | 典型问题 |
|---|---|---|---|---|
| Brovey | 必须 RGB 三波段 | 较好 | 中等 | 对 B8 动态范围敏感 |
| HSV | 必须 RGB 三波段 | 较差 | 较好 | 色度被重采样 |
| PC | 波段数不限 | 好 | 中等 | 色调偏移明显 |
4.3 定量评价:均值、标准差、信息熵、平均梯度
目视解译只能定个性,要写进报告还得有数。原报告用了四个指标:均值、标准差、信息熵、平均梯度。均值和标准差用Basic Tools → Statistics → Compute Statistics直接出,信息熵和平均梯度得自己算。
信息熵衡量图像的信息丰富程度,公式是 H = -Σ p_i · log2(p_i),p_i 是第 i 个灰度级出现的概率。平均梯度衡量清晰度,公式是 g = (1/(M·N)) · Σ sqrt((ΔI_x² + ΔI_y²)/2),也就是水平和垂直方向梯度平方和的均值开根。ENVI 本身不算这两个,原报告是把影像导出成 ASCII 再用 MATLAB 算,导出时把小数位数设成 0,也就是按整数灰度级统计。
我复现时把这套计算写成了一个函数,比反复导 ASCII 省事:
function [H, AG] = fusionIndex(imgPath) % 读入单波段融合影像,计算信息熵与平均梯度 I = imread(imgPath); if size(I, 3) > 1 I = rgb2gray(I); % 彩色图先转灰度 end I = double(I); % 统一到 0-255 的整数灰度级,否则熵会被浮点小数位虚高 I = round((I - min(I(:))) ./ (max(I(:)) - min(I(:))) * 255); % 信息熵:按 256 级统计概率分布 counts = histcounts(I(:), -0.5:1:255.5); p = counts / sum(counts); p = p(p > 0); % log2(0) 会出 -Inf,先剔除 H = -sum(p .* log2(p)); % 平均梯度 [dIdx, dIdy] = gradient(I); AG = mean(sqrt((dIdx.^2 + dIdy.^2) / 2), 'all'); end代码里最关键的是round那一行。如果直接把浮点反射率拿去统计熵,灰度级会被细分到上千级,算出来的熵虚高,和别人的结果没法比。统一到 256 级之后,不同融合方法之间才有可比性。另外,p(p>0)这一步不能省,零概率项会让熵变成-Inf或者NaN。
还有一个更容易翻车的点:原报告表格里,融合前影像的均值在 10 到 16 之间,Brovey 融合后均值掉到 0.1 到 0.2,HSV 融合后均值变成 63 左右。这三个数根本不在一个量纲上,直接比信息熵和平均梯度是没意义的。做对比之前必须把所有影像拉到同一量化级,否则结论会完全反过来。我在复现时踩过这个坑。当时算出来 HSV 的信息熵比原图高了 25%,看着像提升了,实际上是它用了 0 到 255 而原图用的是 0 到 1,纯属量纲差异。
4.4 NDWI 阈值分割与水体掩膜
水体提取在这套流程里用的是归一化水体指数。Landsat 8 对应的做法是拿绿波段和近红外波段做差除和,Band Math 表达式写(float(b3)-float(b5))/(float(b3)+float(b5)),其中 b3 是绿波段、b5 是近红外。float()不能省,ENVI 的整型波段直接相减会截断成 0。
算完得到一张灰度图,接着在显示窗口里用Overlay → Density Slice做密度分割,把 NDWI 从高到低切成若干段,目视确定水陆分界的那条阈值线。原报告里阈值定在 0.2256,这个数不是固定的,每景影像、每个季节都不一样,丰水期和枯水期能差出 0.1 以上,必须逐景调整。
阈值定好之后用Basic Tools → Masking → Apply Mask生成掩膜,把大于阈值的像元保留,其余置为背景值。这一步的坑在于背景值和真实水体的值可能撞车。原报告里就遇到了:研究区边缘有条河,掩膜之后河流和背景一起变成黑色,因为两者都被赋成了同一个低值。解决办法是把背景值设成一个水体反射率不可能出现的位置,比如-999,或者在掩膜之后单独统计一下河流经过的像素值,确认没被误杀。
4.5 像元二分模型推植被覆盖度
植被覆盖度的常用算法是像元二分模型,公式是 FVC = (NDVI - NDVI_soil) / (NDVI_veg - NDVI_soil)。NDVI 还是用 Band Math 算,表达式(float(b5)-float(b4))/(float(b5)+float(b4))。
关键在两个端值的取法。理论上是纯裸土和纯植被的 NDVI,但影像里很难找到绝对纯的像元,工程上一般取 NDVI 累计分布的 5% 和 95% 分位数作为 NDVI_soil 和 NDVI_veg。取 5% 和 95% 是为了排除极端的阴影和水体像元干扰,如果研究区水域面积大,这两个分位数会被压低,得改成 2% 和 98% 或者先用水体掩膜剔掉。
算完之后用Band Math把结果限制在 0 到 1 之间,超出范围的直接截断,不要保留负值——负的覆盖度在图上会显示成很怪的颜色,答辩的时候一眼就被看出来。
4.6 温度反演的两条路线与参数来源
温度反演有两种做法,大气校正法和单窗算法,前者精度高但需要实时大气剖面数据,后者靠经验公式,参数少但误差大一些。实习报告里两条都做了,正好可以对比。
第一条路是大气校正法,本质是解辐射传输方程:L_λ = [ε·B(T_s) + (1-ε)·L_down]·τ + L_up。其中 L_λ 是传感器收到的辐亮度,从 B10 的辐射定标结果拿;τ 是大气透过率,L_up 和 L_down 是上行和下行辐射,这三个量 FLAASH 输出的时候会附带一个文本文件,里面有逐波段的透射率和路径辐射,直接抄;ε 是地表比辐射率,用 NDVI 阈值法估,NDVI 大于 0.5 取 0.99,小于 0.2 取 0.97,中间按公式插值。反解出 B(T_s) 之后,用普朗克函数反演温度。
第二条路是单窗算法,公式是 T_s = [a(1-C-D) + (b(1-C-D) + C + D)·T_sensor - D·T_a] / C,其中 C = ε·τ,D = (1-τ)·[1 + (1-ε)·τ],a 和 b 是常数(取 -67.355351 和 0.458606),T_sensor 是传感器亮温,T_a 是大气平均作用温度,按近地面气温估算。亮温本身还得先算:T = K2 / ln(K1/L_λ + 1),Landsat 8 B10 的 K1 = 774.8853 W/(m²·sr·µm),K2 = 1321.0789 K,这两个常数在 MTL 里也能找到。
两条路的输入都是 B10 的辐亮度,所以前面 Layer Stacking 时把 B10 排除掉之后,这里得单独对 B10 做一次辐射定标,用 B10 自己的增益偏置,别拿错。算出温度之后按 5 K 一档做分级,得到温度反演分级图,再和土地利用分类图叠加,就能看不同地类的热特征差异——建成区明显高于水体和林地,这个结论在多数县域都成立。
5. 避坑与排查:五个让整条链白跑的细节
这套流程走下来,最耗时的不是操作,是结果不对的时候不知道从哪查。下面五条是我复现过程中真实翻车的地方,按发生概率从高到低排。
现象一:FLAASH 输出的影像整体偏蓝,植被的近红外反射率只有 0.15 左右,Z-Profile 上看不到植被应有的反射峰。
原因是 Layer Stacking 时波段顺序和 Edit Header 里填的中心波长错位了。ENVI 只按序号对应,不看波段名,顺序一乱,B5 的近红外波长就被安到了别的波段上。
解决:回到头文件,View Metadata里核对Wavelength字段是不是 0.443、0.482、0.561、0.655、0.865、1.609、2.201、0.590 这个顺序。错了就重新 Edit Header,别在 FLAASH 里调参数硬凑,那是治标不治本。
现象二:大气校正后的反射率整体偏暗,同一块植被在两景影像上的值差了 0.1 以上。
原因是 FLAASH 的Flight Time GMT填成了文件生成时间,不是成像时间。太阳天顶角算错,辐照度就错,反射率自然偏。
解决:打开 MTL,找DATE_ACQUIRED和SCENE_CENTER_TIME两个字段,用前者对应的日期和后者对应的时刻组合成 GMT 时间。填完可以反查一下:研究区在北半球,夏季上午成像的太阳天顶角一般在 25 到 35 度之间,如果算出来是 60 度,肯定是时间填错了。
现象三:融合结果整体发灰,Brovey 融合的像元值集中在 0.1 到 0.2 之间,几乎看不出地物。
原因是 B8 没有做量纲对齐,0 到 1 的浮点全色波段直接参与融合,比值被压得极小。
解决:先对 B8 做Stretch Data,拉到 0 到 255,再和多光谱融合。如果多光谱是浮点,两边都拉到同一量级,或者都转成 Byte。融合前抽一行像元看看两边的数值范围,差一个数量级以上就别往下做。
现象四:定量评价的结论和目视解译完全相反,HSV 的信息熵算出来最高,但目视明明最糊。
原因是参与比较的影像量纲不统一:原图是 0 到 1 的反射率,Brovey 输出 0 到 1,HSV 输出 0 到 255。熵是按灰度级概率算的,灰度级划分不同,熵自然不可比。
解决:评价前统一量化级,全部 round 到 0 到 255,或者全部归一化到 0 到 1 后按固定级数(比如 256 级)重新量化。这一步做完再算熵和平均梯度,结论才站得住。
现象五:水体掩膜之后,研究区边缘的河流和背景一起变成黑色,提取面积比实际少了将近三成。
原因是Mask Background Value设成了 0,而这条河的部分河段 NDWI 值本来就接近 0,被当成背景一起掩掉了。
解决:背景值改成-999这类物理上不可能出现的值,或者干脆不设背景值,改用Apply Mask时保留原始值、单独生成一张掩膜图。改完重新统计水体面积,和目视判读的河网长度对一遍。
6. 从分类到变化监测:把两个时相真正对上
分类这块,非监督的 ISODATA 和监督的最大似然各有各的用法。ISODATA 只需要设类别数、最大迭代次数和变化阈值,我一般类别数设成预期地类数的 2 到 3 倍(比如预期 5 类就设 12 到 15),迭代 20 次,阈值 0.95,先跑一版看聚类中心分布,再决定合并哪些类。监督分类的关键在样本:每类至少 100 个像元,样本分离度用ROI Separability算,低于 1.8 的类别要重新选,否则最大似然会把两类混成一类。神经网络分类器对样本量要求更高,但边界更贴合实际,代价是训练时间长、结果不可复现(每次初始化权重不同)。
变化监测要成立,前提是两个时相的分类图用的是同一套分类体系和同一套样本规则。我见过最常见的错误是 2013 年用了一套样本、2019 年重新选了一套,两套样本的地类定义对不上,最后用Change Detection Statistics一算,建设用地增加了 40%,实际是把农田误分成了建设用地。正确做法是把两期影像叠在一起选样本,或者至少保证两期的类别名、类别数、样本选取标准完全一致,再用Post Classification → Change Detection Statistics生成转移矩阵。
从那以后我每次做变化监测,都会先把两期的分类图并排打开,随机抽 20 个点人工核对类别,确认无误再进转移矩阵。这个习惯救过我好几次,也让我明白遥感流程里最贵的不是算力,是返工。希望帮到你。
本文还有配套的精品资源,点击获取