用 WebODM 与 QGIS 将大疆 P4 多光谱影像处理为小区尺度性状
在 WebODM 中把大疆 P4 多光谱影像处理为辐射信息完整的正射影像,在 QGIS 中核查波段,并提取小区尺度的植被指数与纹理特征。
Liangchao DengPostdoctoral Researcher概述
本文介绍如何用 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. 创建多光谱任务
- 新建项目,使用固定、易识别的名称,例如
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 前,先在 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。
- 已对阈值和纹理参数做敏感性测试。
- 每份统计结果都附有小区覆盖度和有效像元数。
- 已归档软件版本、任务参数和计算公式。

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