跳到主要内容
本页目录
Research notebook

用 WebODM 与 QGIS 将大疆 P4 多光谱影像处理为小区尺度性状

在 WebODM 中把大疆 P4 多光谱影像处理为辐射信息完整的正射影像,在 QGIS 中核查波段,并提取小区尺度的植被指数与纹理特征。

概述​

本文介绍如何用 WebODM 和 QGIS,把大疆 P4 多光谱的原始影像处理成小区尺度的特征表。处理中要注意三点:区分原始数字量化值(DN)和定标后的反射率;波段顺序和坐标系要逐一核实;NoData 像元不能混入植被和纹理统计。

  • 输入: 原始 RGB 与多光谱影像、元数据、小区边界,以及定标和精度控制资料(如有)
  • 输出: 核查过的正射影像波段、植被指数、纹理图层(可选)和小区尺度统计量
  • 版本: WebODM 与 QGIS 不同版本的菜单名称有所不同,下文按功能描述各项操作

1. 保存好原始数据​

P4 多光谱每次拍摄通常得到一张 RGB 影像和五个窄波段影像:蓝、绿、红、红边、近红外。相机生成的文件和元数据应作为只读的原始数据保存。

处理之前:

  • 复制而不是移动原始文件夹;
  • 把同一次采集的所有波段放在一起;
  • 保留 EXIF/XMP 元数据、曝光信息和相机文件名;
  • 检查每次采集是否都包含预期的波段集合;
  • 记录航飞、光照、定标板、RTK/GNSS 与地面控制信息;
  • 对完整性要求高的数据,计算校验值。

仅靠下行光照传感器并不能保证反射率准确。拍摄定标板、在稳定的光照条件下采集并做独立验证,辐射定标才更可靠。

2. 安装并启动 WebODM​

WebODM 运行在 Docker 中。安装 Docker Desktop 和 Git,分配足够的内存和磁盘空间,然后克隆官方仓库:

git clone https://github.com/OpenDroneMap/WebODM
cd WebODM
./webodm.sh start

打开 http://localhost:8000,首次使用时创建本地管理员账号。

各操作系统的安装要求以 WebODM 最新的安装文档为准。不要随意把来路不明的第三方镜像源写进 Docker 配置,它们的可用性和安全性都没有保障。

3. 创建多光谱任务​

  1. 新建项目,使用固定、易识别的名称,例如 maize-n-trial-2025。
  2. 新建任务,上传全部波段的影像。
  3. 如果有多光谱预设,选择它。
  4. 将 WebODM/ODM 的具体版本和任务参数与结果一并保存。

辐射定标​

OpenDroneMap 提供三种辐射定标模式:

  • none —— 输出保持在传感器 DN 空间;
  • camera —— 在所需元数据存在时,应用受支持的相机校正;
  • camera+sun —— 额外使用下行光照传感器信号与太阳几何;ODM 文档标注该模式为实验性。

选择哪种模式,要在论文方法部分写明。定标方式为 none 时,输出不能称为“反射率”。

波段对齐与重建​

  • ODM 默认会对齐各波段。除非已确认输入影像本身已经对齐,否则不要启用 skip-band-alignment。
  • 主波段保持自动选择,或经检查后指定一个清晰、对焦好的波段。
  • 只有相机标定和相机模型足够可靠时,才固定相机参数。
  • use-exif 不是“启用 GPS”的开关。ODM 本来就会读取影像元数据;这个选项用于已提供 GCP 文件、但仍希望使用 EXIF 地理信息的情况。
  • 只需要二维成果时,skip-3dmodel 可以省去不必要的输出,但中间的点云计算并不会因此全部跳过。

研究对测量精度有要求时,应布设分布均匀的地面控制点和独立检查点。即使影像带有 RTK 定位,最终成果图仍需验证。

4. 检查 WebODM 的输出​

从任务结果中下载正射影像和处理报告。下载文件的名称可能不同,不一定是 orthophoto.tif。

在计算指数之前,请记录:

  • 栅格尺寸、数据类型和 NoData 值;
  • 坐标参考系与像元大小;
  • 波段数量以及每个波段的描述;
  • 数值是 DN 还是类反射率的定标值;
  • 处理警告以及定位/检查点误差。

可用 gdalinfo 或 QGIS → 图层属性 → 信息 查看。红光和近红外的波段编号一定要以实际文件为准,不能照搬网上的例子。

5. 建立 QGIS 工程​

在 QGIS 中加载多波段正射影像和小区边界图层。

根据测区位置选择坐标系​

空间运算和小区面积计算应使用以米为单位的投影坐标系,UTM 带号或地方坐标系要根据测区实际位置确定。例如 EPSG:32645 只适用于确实位于该带内的数据。

必要时对小区图层重投影。只修改图层的坐标系定义而不转换坐标,并不是重投影。

裁剪时保留 NoData​

用田块边界执行 按掩膜图层裁剪栅格:

  • 启用裁剪至掩膜范围;
  • 设定明确的 NoData 值;
  • 保留原始栅格;
  • 目视检查裁剪边缘和像元是否对齐。

6. 计算 NDVI​

NDVI 的定义为:

NDVI = (NIR - Red) / (NIR + Red)

核实波段编号后,在 QGIS 栅格计算器中替换以下占位符:

("orthomosaic@<NIR 波段>" - "orthomosaic@<Red 波段>") /
("orthomosaic@<NIR 波段>" + "orthomosaic@<Red 波段>")

同时建立有效数据掩膜,排除原有的 NoData 和分母为零的像元。结果保存为 Float32,并检查:

  • 田块图案是否符合预期;
  • 是否存在 [-1, 1] 之外的数值;
  • 是否有拼接缝、阴影、过曝,以及未经定标造成的曝光差异;
  • 与已知植被区和裸土区是否一致。

NDVI 落在有效区间内,不代表每个数值在生物学上都合理。如何解读取决于作物、生育期、大气、土壤、观测几何和定标情况。

7. 构建植被掩膜​

0.2 这类阈值只是针对具体试验的初始值,并不是通用的植被界限。应根据有代表性的标注像元或有记录的敏感性分析来确定。

分别保存两个栅格:

  1. 二值植被掩膜;
  2. 把非植被像元设为 NoData(而非 0)的 NDVI。

如果把 NDVI 直接乘以二值掩膜,背景会变成 0。这些 0 会被计入均值;如果之后为量化平移了数值范围,它们还会变成中间灰度。做分区统计或纹理计算前,应先用明确的 NoData 掩膜处理。

8. 纹理计算前的量化​

GRASS 的 r.texture 要求输入为整数灰度级。需要记录输入图层、有效范围、缩放系数、偏移量、取整方式和 NoData 的处理方法。

若要把完整的 NDVI 区间 [-1, 1] 映射到 UInt8,变换公式为:

UInt8 = round((NDVI + 1) × 127.5)

只对有效植被像元做 0–255 截断,背景保持 NoData。根据数据自身范围拉伸可以提高对比度,但不同日期必须使用同一套有记录的上下限,否则彼此无法比较。

9. 计算 GLCM 纹理​

使用 r.texture 前,先在 QGIS 中启用 GRASS 处理工具。常用输出包括:

  • asm —— 角二阶矩;
  • contrast —— 局部灰度对比度;
  • corr —— 相关性;
  • idm —— 逆差矩;
  • entr —— 熵。

sa 是和平均值(sum average),不是 ASM 的别名;dv 是差方差(difference variance)。

请记录:

  • 窗口大小(像元数)及其对应的实地尺寸(米);
  • 像元距离;
  • 方向或方向聚合方式;
  • 量化规则;
  • 边缘与 NoData 的处理行为。

窗口大小要根据地面采样距离(GSD)和所关心的生物学尺度来选。同样是 7 像元的窗口,在 2 cm 和 10 cm 的 GSD 下覆盖的冠层面积相差很大。

10. 提取小区尺度统计量​

以小区多边形和固定的 plot_id 运行 分区统计。

常用的统计量包括:

  • 有效像元数与覆盖比例;
  • 均值、中位数、标准差和选定分位数;
  • 植被覆盖度;
  • 选定的纹理指标。

统计时排除 NoData,并标出有效植被像元过少的小区。属性表导出为 CSV 时,要附上处理参数等元数据,否则别人无法理解这张表。

验证清单​

  • 每次拍摄都包含应有的波段和元数据。
  • 已记录辐射定标模式和定标依据。
  • 计算指数前已核对波段说明。
  • 坐标系与地面采样距离与测区相符。
  • 已报告地面控制点和独立检查点的误差(如有)。
  • 性状统计中,背景像元为 NoData 而不是 0。
  • 已对阈值和纹理参数做敏感性测试。
  • 每份统计结果都附有小区覆盖度和有效像元数。
  • 已归档软件版本、任务参数和计算公式。

参考资料​

讨论

有问题或田间观察想交流?