在长时间序列的植被覆盖(NDVI、LAI)、气温或降水变化研究中,我们经常需要回答两个问题:
- 趋势是什么?(变绿了还是变黄了?)
- 趋势显著吗?(是真变了,还是偶然波动?)
学术界公认的黄金标准方法便是 Theil-Sen Median (Sen 斜率) 结合 Mann-Kendall (MK) 显著性检验。
以往我们可能需要借助 MATLAB,或者在 ArcGIS 中进行复杂的栅格计算器叠加,甚至需要把栅格转成点提取到 Excel 做分析,步骤繁琐且容易出错。
今天分享一段 Python 代码,利用 rasterio 和 numpy 库,一键实现从读取多时相 TIFF 影像到输出最终趋势分类图的全过程!

1 原理简介
为什么是 Sen + MK?
- Sen's Slope (Sen 斜率):对时间序列中所有两两数据点组合,逐一计算斜率,最终取中位数斜率作为趋势估计值。相比于普通的一元线性回归,它对异常值不敏感,非常适合处理容易受云雾干扰的遥感数据。其基本公式为:

判别:β > 0:上升趋势;β < 0:下降趋势;β ≈ 0:无趋势
- Mann-Kendall (MK) 检验:一种非参数检验方法。它不需要数据服从正态分布,能有效检验趋势是否显著(即排除随机波动的可能性)。统计量 S 是对时间序列中每对 (xi,xj)(j>i),若后者更大则 +1,更小则 -1,相等则 0,最后求和。标准化后得 Z 统计量。公式:

判别:在显著性水平 α = 0.05(双尾)下,|Z| > 1.96** 表示趋势显著,|Z| ≤ 1.96 表示趋势不显著。
这里我们借助 Ai,绘制了一张完整的计算流程示意图

2 核心代码实现
本脚本支持读取文件夹内按年份命名的 TIF 影像(如 LAI_2001.tif...你需要修改你自己的文件命名格式),自动逐像元计算,最终输出一张带有分类结果的 GeoTIFF 图像。
(1)环境依赖
pip install numpy rasterio tqdm scipy
(2)完整代码



