跳到主要内容
On this page
Research notebook

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

一套以验证为先的工作流:在 WebODM 中处理大疆 P4 多光谱影像,在 QGIS 中核查波段元数据,并提取小区尺度的植被特征。

项目概述

本指南把大疆 P4 多光谱的原始影像,经由 WebODM 和 QGIS,一路处理成小区尺度的特征表。过程中会区分数字量化值(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 之前,请先启用 GRASS 处理提供程序。常见输出包括:

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

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

请记录:

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

窗口大小应根据地面采样距离(GSD)和你关心的生物学尺度来选择。在 2 cm GSD 下的 7 像元窗口,与 10 cm GSD 下的同样窗口,代表的冠层面积完全不同。

10. 提取小区尺度统计量

用小区多边形和稳定的 plot_id 运行 分区统计

有用的汇总量包括:

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

排除 NoData,并标记出有效植被过少的小区。把属性表连同处理元数据一起导出为 CSV,而不是作为一张无从解释的孤立表格。

验证清单

  • 每次采集都包含预期的波段和元数据。
  • 已记录辐射定标模式与定标证据。
  • 计算指数前已核查波段描述。
  • 坐标系与地面采样距离与测区相符。
  • 在适用时,已报告地面控制与独立检查的误差。
  • 在性状统计中,背景像元是 NoData 而不是数值 0。
  • 已对阈值与纹理参数做过敏感性测试。
  • 每份汇总都附有小区覆盖度与有效像元数。
  • 已归档软件版本、任务选项和计算公式。

参考资料

DISCUSSION

Questions or field notes?