用 WebODM 与 QGIS 将大疆 P4 多光谱影像处理为小区尺度性状
一套以验证为先的工作流:在 WebODM 中处理大疆 P4 多光谱影像,在 QGIS 中核查波段元数据,并提取小区尺度的植被特征。
Liangchao DengPostdoctoral Researcher项目概述
本指南把大疆 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. 创建多光谱任务
- 创建项目,使用稳定的标识,例如
maize-n-trial-2025。 - 创建任务,把所有波段一起上传。
- 如果有多光谱预设,选择它。
- 把确切的 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 这样的阈值,是针对具体试验的起点,而不是普适的植被边界。请通过有代表性的标注像元或有据可查的敏感性分析来选定。
请保留两个独立的栅格:
- 二值植被掩膜;
- 把非植被像元设为 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?