简介:这是一份面向农业遥感与精准农业研究者的方法类文档,核心内容是运用无人机多光谱影像,结合多时相NDVI与端元丰度综合分析油菜长势并构建产量估测模型。文档以完整研究案例为线索,详细阐述了48块实验小区设计、叶期/花期/角果期无人机影像获取、ASD光谱仪端元光谱采集、几何纠正与辐射定标、全约束混合光谱线性解混等步骤,并重点分析了不同时期丰度数据与产量构成要素的相关性,进而提出融合生育期特征的多元线性回归估产模型。与单纯依赖NDVI的统计模式相比,该方法从亚像元和器官发育层面修正了估产逻辑,有助于提升跨区域与跨年应用效果。资源为1个docx文档,约327KB,结构完整,数据采集、模型构建和结果分析脉络清晰,可供撰写论文或设计同类无人机遥感监测实验参考。已有227人学习下载,对农业遥感方向的师生及技术人员有一定实用性。
1. 油菜无人机遥感估产为什么不能只信NDVI
无人机遥感做油菜长势监测,最省事的做法是算NDVI,但NDVI有个天然缺陷:它只告诉你“这片地够不够绿”,说不清“绿的是哪个器官”。油菜的产量大约90%~95%来自光合产物,而叶期、花期、角果期分别对应角粒数、角果数、千粒重的形成窗口,叶片、花、角果在不同时期对产量的贡献权重完全不一样。这项研究用Mini-MCA六波段相机分别在40m和50m航高采集了油菜叶期、花期、角果期三组影像,配合ASD光谱仪采集端元光谱做全约束线性解混,先把混合像元拆成各端元的丰度,再把丰度与NDVI相乘作为自变量建模。结果里有一个反直觉的数字:直播油菜在花期,叶丰度与产量的相关系数是-0.475,而移栽油菜是0.885。这个翻转说明,单纯堆植被指数解决不了种植方式差异带来的结构性问题,多时相丰度信息才是修正估产模型的关键。本文把这套流程从端元采集、解混实现、相关性分析到模型对比完整拆开,适合做作物遥感估产、农业无人机应用和光谱解混方向的人。
2. 混合像元解混:端元光谱采集与全约束线性模型落地
2.1 混合像元为什么绕不开
油菜冠层不是一层平板结构。叶期田里有长柄叶、短柄叶,还有干土、半干土、湿土;花期长出花序,叶片开始变黄;角果期角果层形成后把叶片遮得严严实实。Mini-MCA的6个波段分别是485~495nm、545~555nm、665~675nm、715~725nm、780~820nm、890~910nm,空间分辨率有限,单个像元内往往是几种地物的反射叠加。如果直接把像元反射率代入NDVI,得到的是混合信号,无法区分叶片贡献和土壤贡献。
线性光谱解混模型把像元光谱看成端元光谱的加权和:
P = Ec + n
其中P是像元的波谱向量,E是端元反射率矩阵,c是端元丰度系数,n是误差项。解混要满足两个约束:非负性约束(ci ≥ 0)和归一化约束(Σci = 1)。换句话说,每个像元里端元占比不能为负,且所有端元占比加起来必须等于1。
2.2 物理端元提取:ASD光谱仪采集与重采样
端元光谱的质量直接决定解混结果的可靠性。这项研究用的是物理端元提取法,也就是野外实测。ASD光谱仪探测范围350~2500nm,比MCA六波段宽得多,所以采集后要按MCA的波段范围做均值重采样。采集时有两个关键操作:
- 探头垂直向下,距地物约0.2m
- 每个采样点记录5条光谱,选分布均匀的3~5个点取平均值
直接把ASD原始光谱塞进解混模型是不行的。MCA每个波段是一个范围(比如780~820nm),必须把ASD光谱在这个范围内做均值,得到对应6个波段的反射率向量,才能与影像波段对齐。几何纠正时以第5波段(780~820nm)作为基准波段做配准,这个波段对植被反射率变化最敏感,配准误差对后续解混的影响最小。
2.3 全约束线性解混的Python实现
端元矩阵准备好之后,解混本质上是一个带约束的最小二乘问题。严格的全约束需要同时满足非负和和为1,可以在目标函数里加等式约束,也可以用两步近似:先用非负最小二乘(NNLS)解出丰度,再归一化。
import numpy as np from scipy.optimize import nnls def fully_constrained_unmix(pixel, endmembers): """ 全约束线性光谱解混 pixel: array, shape (bands,), 单像元反射率 endmembers: array, shape (bands, n_endmembers), 端元光谱矩阵 返回: abundance, shape (n_endmembers,) """ # 第一步:非负最小二乘,满足 ci >= 0 abundance, residual = nnls(endmembers, pixel) # 第二步:归一化,满足 sum(ci) = 1 total = np.sum(abundance) if total > 0: abundance = abundance / total return abundance # 六个波段的端元光谱示例(每行一个端元) endmembers = np.array([ [0.12, 0.15, 0.10, 0.08, 0.35, 0.38], # 无柄叶 [0.10, 0.13, 0.09, 0.07, 0.30, 0.33], # 短柄叶 [0.20, 0.18, 0.15, 0.14, 0.22, 0.20], # 上层花 [0.08, 0.09, 0.10, 0.11, 0.12, 0.12], # 干土 [0.07, 0.08, 0.09, 0.09, 0.10, 0.10], # 半干土 [0.05, 0.06, 0.06, 0.06, 0.07, 0.07], # 湿土 ]).T # 转置为 (bands, n_endmembers) # 读取一个像元的反射率 pixel = np.array([0.11, 0.13, 0.10, 0.09, 0.28, 0.30]) abundance = fully_constrained_unmix(pixel, endmembers) print("丰度: ", abundance)NNLS只处理非负约束,归一化步骤相当于把误差分散到所有端元上。严格意义上这一步是近似,因为先最小化残差再归一化,不一定是带归一化约束下的最优解。项目规模不大时这种近似足够稳定;如果要求更严格,可以用scipy.optimize.minimize配合SLSQP方法加入Σci=1的等式约束,但迭代速度会慢不少。对整幅影像逐像元解混时,建议用numpy向量化批量处理,避免Python循环成为瓶颈。
2.4 六波段上限与端元选择约束
线性解混有个硬性限制:端元数量不能超过波段数。MCA只有6个波段,所以每个时期最多选6种端元。花期选的6种是上层花、无柄叶、短柄叶、干土、半干土、湿土。从光谱曲线看,花与叶片在绿波段的反射率有明显差异,土壤和油菜植株在近红外波段的差异更大,这些光谱可分性是端元能解出来的前提。
选端元时要注意,多个端元之间光谱高度相似会让解混矩阵病态,丰度解不稳定。比如花期把长柄叶、短柄叶、无柄叶全放进去,三者在绿波段反射率差异不大,容易出现丰度在端元之间来回跳的现象。实际处理中把长柄叶和短柄叶合并成“叶丰度”计算,或者只保留与产量相关性最强的端元组合,解混结果会更干净。
3. 叶期、花期、角果期:丰度与产量相关性的三张表
3.1 叶期:叶丰度是移栽油菜的产量风向标
叶期实验田里主要是叶片和土壤,选取长柄叶、短柄叶、干土、半干土、湿土5种端元。解混后把长柄叶与短柄叶丰度相加得到叶丰度。移栽油菜叶丰度与产量的皮尔逊相关系数是0.889,直播油菜是0.818,都属于极强相关(0.8~1.0)。
叶片是油菜营养生长的核心器官,长柄叶主要供应根系养分,短柄叶养分供应兼顾上下,两者在净光合速率上有差异。叶期同化作用积累的干物质是后续花芽分化和角果建成的物质基础,所以叶丰度高意味着光合面积大,为产量形成打下的底子好。
3.2 花期:直播油菜的负相关陷阱
花期地物组成明显变复杂:花序遮挡茎秆,叶片开始变黄,干物质向花转移。这时选取上层花、无柄叶、短柄叶、干土、半干土、湿土6种端元。
花期丰度与产量的相关系数差异很大:
| 端元丰度 | 移栽 | 直播 |
|---|---|---|
| 叶丰度 | 0.885 | -0.475 |
| 花丰度 | 0.473 | 0.837 |
移栽油菜叶丰度依然保持极强相关,而直播油菜的叶丰度变成了负相关。原因在于直播油菜单株产能不高,但最终亩产靠密度取胜。直播田里叶丰度高意味着营养生长过旺,群体内通风透光差,反而压制了生殖生长。这个现象说明,丰度与产量的关系不能脱离种植方式单独解释。
from scipy.stats import pearsonr # 以花期为例:计算不同端元丰度与产量的相关系数 leaf_abundance = [0.62, 0.58, 0.66, 0.54, 0.60, 0.48] # 叶丰度 flower_abundance = [0.18, 0.22, 0.15, 0.26, 0.20, 0.30] # 花丰度 yield_data = [310.5, 295.2, 325.8, 280.4, 305.1, 268.9] r_leaf, p_leaf = pearsonr(leaf_abundance, yield_data) r_flower, p_flower = pearsonr(flower_abundance, yield_data) print(f"叶丰度相关系数: {r_leaf:.3f}, p值: {p_leaf:.4f}") print(f"花丰度相关系数: {r_flower:.3f}, p值: {p_flower:.4f}")pearsonr返回两个值,第一个是相关系数,第二个是p值。p值用来判断相关性是否统计显著,样本量只有24个时,p值低于0.05才比较可靠。相关系数绝对值0.8以上是极强相关,0.6~0.8强相关,0.4~0.6中等程度相关。
3.3 角果期:角果皮光合与千粒重
角果期是千粒重的定型阶段。终花后角果和叶片一起进行光合作用,角果层形成后叶片严重受光不足,短柄叶和无柄叶表面积减少,角果皮产生的同化物直接转移给籽粒。这个时期选取无柄叶、短柄叶、上层角果、下层角果、干土、湿土6种端元。
移栽油菜叶丰度与产量相关性仍高达0.880,角果丰度只有0.256;直播油菜叶丰度0.531,角果丰度0.766。直播油菜角果丰度与产量的相关性明显强于移栽,这与直播油菜密度大、后期冠层郁闭、角果层成为主要光合器官的生理特征一致。
三个时期的相关系数汇总:
| 生长期 | 端元 | 移栽 | 直播 |
|---|---|---|---|
| 叶期 | 叶丰度 | 0.889 | 0.818 |
| 花期 | 叶丰度 | 0.885 | -0.475 |
| 花期 | 花丰度 | 0.473 | 0.837 |
| 角果期 | 叶丰度 | 0.880 | 0.531 |
| 角果期 | 角果丰度 | 0.256 | 0.766 |
移栽油菜的叶丰度在三个时期与产量的相关系数全部高于0.88,非常稳定。直播油菜则没有一个端元能在三个时期保持强相关。这个差异直接决定了后面多时相模型的自变量选择策略:移栽油菜无脑选三个时期的叶丰度,直播油菜要试组合。
4. NDVI×丰度多时相建模:留一交叉验证下的三种方案对比
4.1 三种自变量方案的设计逻辑
多时相估产模型采用多元线性回归,形式是y = β0 + β1x1 + β2x2 + β3x3。自变量选取是整个建模的核心。研究设计了三个方案:
| 方案 | 自变量定义 | 端元组合 |
|---|---|---|
| 方案1 | 三个时期的NDVI | 无 |
| 方案2 | 三个时期的端元丰度 | 移栽A:叶期叶丰度、花期叶丰度、角果期叶丰度;直播A:同移栽A;直播D:叶期叶丰度、花期花丰度、角果期角果丰度 |
| 方案3 | 三个时期的NDVI×对应端元丰度 | 与方案2相同的组合 |
方案3的设计灵感来自干物质积累路径:NDVI反映冠层整体绿色程度,丰度反映具体器官的覆盖比例,二者相乘等于把“绿色程度”按“器官构成”加权,从亚像元层次修正NDVI。
4.2 方案1与方案2:NDVI基线能力与丰度模型的差距
| 种植方式 | 方案 | 自变量组合 | R² | RMSE |
|---|---|---|---|---|
| 移栽 | 方案1 | 三时期NDVI | 0.847 | 284.982 |
| 移栽 | 方案2 | A(三时期叶丰度) | 0.890 | 241.153 |
| 移栽 | 方案2 | B(叶叶角果) | 0.811 | 295.873 |
| 移栽 | 方案2 | C(叶花叶) | 0.797 | 306.500 |
| 直播 | 方案1 | 三时期NDVI | 0.849 | 264.521 |
| 直播 | 方案2 | A(三时期叶丰度) | 0.794 | 308.677 |
| 直播 | 方案2 | D(叶花角果) | 0.749 | 340.746 |
移栽油菜方案2的A组合(0.890)超过了方案1(0.847),说明对冠层结构简单的移栽油菜来说,器官丰度信息比NDVI更能解释产量。直播油菜两种丰度组合都不如NDVI,但A组合相对D组合更好,这与直播油菜角果期叶丰度相关性较弱但仍有0.531有关。只靠丰度建立模型存在精度上限,原因是解混得到的丰度误差会在回归里被放大。
4.3 留一交叉验证的代码实现
样本只有24个时,常规的train/test分割会浪费太多数据。留一交叉验证每次留1个样本做验证,剩下23个训练,重复24次,把所有验证结果平均,得到对泛化误差的无偏估计。
import numpy as np from sklearn.model_selection import LeaveOneOut from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error # X的每一列是一个时期特征:这里以方案3 A组合为例 # 三列分别是 叶期NDVI×叶丰度, 花期NDVI×叶丰度, 角果期NDVI×叶丰度 X = np.array([ [0.42, 0.55, 0.48], [0.38, 0.52, 0.45], [0.45, 0.58, 0.50], # ... 24个样本 ]) y = np.array([310.5, 295.2, 325.8, 280.4, 305.1, 268.9, # ... 24个产量实测值 ]) loo = LeaveOneOut() y_pred = np.zeros(len(y)) for train_idx, test_idx in loo.split(X): X_train, X_test = X[train_idx], X[test_idx] y_train, y_test = y[train_idx], y[test_idx] model = LinearRegression() model.fit(X_train, y_train) y_pred[test_idx] = model.predict(X_test) rmse = np.sqrt(mean_squared_error(y, y_pred)) print(f"留一交叉验证 RMSE: {rmse:.3f}")LeaveOneOut保证每个样本都被当作验证集恰好一次。模型系数是在23个样本上训练得到的,与最终用全部24个样本训练出的回归公式略有差异,但RMSE更接近真实泛化表现。注意方案3里的x是NDVI与丰度的乘积,量纲与方案1、方案2不同,不能直接比较回归系数大小,只能比较R²和RMSE。
4.4 方案3:乘积自变量把精度推高到0.909
| 种植方式 | 自变量组合 | R² | RMSE |
|---|---|---|---|
| 移栽 | A(叶丰度×NDVI三时期) | 0.909 | 219.278 |
| 移栽 | B(叶叶角果×NDVI) | 0.862 | 252.676 |
| 移栽 | C(叶花叶×NDVI) | 0.847 | 266.452 |
| 直播 | A(叶丰度×NDVI三时期) | 0.822 | 286.948 |
| 直播 | D(叶花角果×NDVI) | 0.810 | 296.859 |
移栽油菜A组合的R²从方案1的0.847提升到0.909,RMSE从284.982降到219.278。直播油菜的D组合从方案2的0.749提升到0.810,逼近方案1但略高于方案1。两种种植方式下最优组合都是A,这个一致性很重要,说明以叶丰度为核心的干物质积累路径具有跨种植方式的普适性,丰度对NDVI的修正效果是稳定可靠的。
方案3 A组合的回归公式:
| 种植方式 | 估产模型 |
|---|---|
| 移栽 | y = 1236.118x1 + 2961.941x2 + 2918.376x3 + 291.675 |
| 直播 | y = 2137.388x1 - 5134.258x2 + 2046.832x3 + 1754.69 |
直播油菜方程里x2(花期叶丰度×NDVI)的系数是-5134.258,负号对应了花期直播油菜叶丰度与产量的负相关(-0.475)。这个系数不是偶然,它说明直播油菜在三叶期后如果叶片过于繁茂,反而会因为冠层郁闭而减产。建模时看到负系数不要急着删变量,先回去看单时期的相关分析,往往能对应上农学解释。
5. 提前一个生育期估产:两时期模型的稳定性验证
5.1 只用叶期和花期数据的效果
实际生产中产量预测需要在收获前给出结论,角果期数据拿到时已经接近采收,指导意义有限。所以只用叶期和花期两组数据重新建模,三种方案对比如下:
| 种植方式 | 评价指标 | 方案1 | 方案2 | 方案3 |
|---|---|---|---|---|
| 移栽 | R² | 0.838 | 0.814 | 0.867 |
| 移栽 | RMSE | 293.379 | 313.762 | 265.565 |
| 直播 | R² | 0.846 | 0.791 | 0.853 |
| 直播 | RMSE | 267.299 | 311.359 | 260.744 |
方案3(NDVI×丰度乘积)在两种种植方式下R²均高于方案1,移栽0.867对0.838,直播0.853对0.846。与三时期全数据模型相比精度略有下降,但对提前估产场景足够了。方案2在这里表现最弱,说明缺少角果期丰度信息的情况下,纯丰度模型的器官覆盖信息不完整。
提前估产模型公式(A组合):
| 种植方式 | 估产模型 |
|---|---|
| 移栽 | y = 2499.708x1 + 2457.636x2 + 198.883 |
| 直播 | y = 2692.617x1 - 4567.276x2 + 1494.461 |
5.2 把模型落成可复用的预测脚本
实际项目中,我一般把训练好的模型系数存成JSON,预测时单独写一个脚本加载系数,避免每次重新训练。
import json import numpy as np # 模型系数:移栽油菜,提前估产,方案3 A组合 model_coef = { "intercept": 198.883, "beta1": 2499.708, # 叶期 NDVI x 叶丰度 "beta2": 2457.636 # 花期 NDVI x 叶丰度 } def predict_yield(ndvi_leaf, abun_leaf, ndvi_flower, abun_flower): """ 输入叶期、花期的NDVI和叶丰度,输出产量预测(kg/亩) """ x1 = ndvi_leaf * abun_leaf x2 = ndvi_flower * abun_flower y = (model_coef["intercept"] + model_coef["beta1"] * x1 + model_coef["beta2"] * x2) return y # 示例:某移栽油菜田块 yield_pred = predict_yield( ndvi_leaf=0.72, abun_leaf=0.65, ndvi_flower=0.68, abun_flower=0.58 ) print(f"预测产量: {yield_pred:.1f} kg/亩")注意x1和x2的输入必须与训练时的特征定义一致,NDVI范围是-1到1,丰度范围是0到1,如果预处理时对特征做过归一化,预测时也要做同样的变换。无人机影像处理中用python遥感影像处理库读出的反射率直接算NDVI,再与解混脚本输出的丰度矩阵逐像元相乘,得到整幅影像的产量空间分布图。
5.3 实操中容易踩的三个坑
第一个坑是端元数量与波段数量的对比。Mini-MCA只有6个波段,花期选了6种端元,解混方程刚好可解,但条件数偏大。如果某个端元光谱与另一个高度相关,丰度解会不稳定,表现为同一地块相邻像元丰度跳变剧烈。缓解办法是减少端元数量或对端元光谱做主成分分析去相关。
第二个坑是NDVI与丰度相乘前的量纲一致性。NDVI的取值范围是-1到1,丰度是0到1,乘积天然被压缩,回归系数会变大。这不是问题,但解释系数时要特别注意,不要拿方案1的系数和方案3直接对比绝对值。
第三个坑是留一交叉验证在小样本下的方差。24个样本做留一,每次训练集只有23个,模型的稳定性受单个异常样本的影响比大样本明显。处理方式是记录24次验证中每次的残差,如果有某一个样本的残差远大于其他样本,回查该小区对应的无人机影像和产量记录,确认是否存在数据采集异常。
线性混合模型对油菜这种立体结构作物只是近似描述,冠层阴影、植株重叠、双向反射分布函数效应都会引入解混误差。后续改进方向是在特征提取阶段引入非线性解混或辐射传输模型,让端元丰度的物理意义更接近真实的器官面积比例。
本文还有配套的精品资源,点击获取