ndvi归一化植被指数详解(定义、计算公式、优缺点)

GIS基础理论
Dr.GIS
wowwwai GIS研习社 · 工具流程与项目排障

本文围绕“ndvi归一化植被指数详解(定义、计算公式、优缺点)”展开,面向 GIS 学生、遥感入门用户和空间数据分析人员,重点讲清楚 NDVI 是什么、怎么计算、结果如何解释,以及在实际项目中容易踩哪些坑。

引言:为什么 GIS 分析中经常使用 NDVI归一化植被指数

NDVI归一化植被指数是遥感和 GIS 中最常见的植被监测指标之一。无论是农作物长势评估、林地覆盖变化、城市绿地分析,还是生态环境监测,NDVI 都经常作为第一步分析结果。

很多初学者的问题不是不会点击软件按钮,而是不清楚 NDVI 的含义:为什么用红光和近红外波段计算?NDVI 值为什么在 -1 到 1 之间?NDVI 越高是否一定代表植被越好?如果不理解这些问题,后续在 QGIS、ArcGIS Pro、ENVI、Google Earth Engine 或 Python 中做分析时,很容易得到看似正确但解释错误的结果。

NDVI归一化植被指数计算公式与NDVI值解释示意图
NDVI归一化植被指数的核心流程:从红光和近红外波段计算植被指数,并用结果栅格判断植被覆盖状况。

背景:NDVI 是什么,适合解决什么 GIS 问题

NDVI 的英文全称是 Normalized Difference Vegetation Index,中文通常译为归一化植被指数。它是一种基于多光谱遥感影像的植被指数,用于描述地表植被的相对活力和覆盖状况。

NDVI 的基本思想很简单:健康植被通常会强烈吸收红光,同时强烈反射近红外光。红光波段与近红外波段的差异越明显,通常说明该区域植被越茂盛。

在 GIS 实践中,NDVI归一化植被指数常用于以下场景:

  • 农田作物长势监测,例如识别长势较弱的地块。
  • 林地、草地、湿地等生态区域的植被覆盖分析。
  • 城市绿化水平评价,例如比较不同街区或行政区的绿地状况。
  • 灾害影响评估,例如火灾、干旱、病虫害前后的植被变化。
  • 遥感分类前的辅助特征构建,例如将 NDVI 作为分类模型输入变量。

需要注意的是,NDVI 不是“植被面积”的直接等价物,也不是“产量”的直接等价物。它更适合表达植被相对状态,需要结合时间、区域、传感器和地面情况一起解释。

原理:NDVI计算公式为什么这样写

NDVI计算公式如下:

NDVI = (NIR - Red) / (NIR + Red)

其中,NIR 表示近红外波段反射率,Red 表示红光波段反射率。

这个公式包含两个关键点:

  • NIR – Red:突出植被对近红外强反射、对红光强吸收的差异。
  • NIR + Red:对结果进行归一化,减少整体亮度差异、地形阴影和传感器增益差异带来的影响。

由于采用差值与和值的比值,NDVI值理论范围通常为 -1 到 1。常见解释可以参考下表:

NDVI值范围 常见地物或状态 解释建议
小于 0 水体、云影、部分建筑阴影 通常不是健康植被,需要结合影像和地物判断。
0 到 0.2 裸地、建设用地、稀疏植被 植被覆盖较低,可能受土壤背景影响明显。
0.2 到 0.5 草地、农田、灌丛、一般植被 存在一定植被覆盖,可用于区域比较。
0.5 到 0.8 较茂盛植被、健康农作物、森林 通常表示植被状况较好。
接近 1 极高植被覆盖或非常强的近红外响应 需要检查是否存在饱和、传感器或预处理问题。

上表只是经验范围,不应直接作为所有地区、所有季节、所有传感器的固定判定标准。不同作物、不同生长期、不同影像来源的 NDVI值可能差异很大。

步骤:如何在 GIS 软件中计算 NDVI归一化植被指数

步骤一:确认影像是否包含红光和近红外波段

计算 NDVI 的前提是影像必须包含 Red 和 NIR 波段。常见卫星影像的波段对应关系如下:

数据源 红光波段 Red 近红外波段 NIR 说明
Landsat 8/9 OLI Band 4 Band 5 常用于中分辨率长期变化分析。
Sentinel-2 MSI Band 4 Band 8 10 米分辨率,适合农业和生态监测。
GF 系列多光谱数据 需查元数据 需查元数据 不同传感器波段编号可能不同,不能凭经验套用。
无人机多光谱影像 需查相机说明 需查相机说明 必须确认相机是否包含近红外通道。

在实际工作中,最容易出错的是把波段编号记错。尤其是 Landsat 5/7、Landsat 8/9、Sentinel-2 的波段编号不同,计算前应先查看官方元数据或影像说明。

步骤二:优先使用地表反射率数据

NDVI计算公式理论上使用的是反射率,而不是原始 DN 值。DN 值是传感器记录的数字量,受太阳高度、传感器设置、大气条件影响较大。

如果只是做教学演示,使用 DN 值也能得到一个近似图层;但如果用于跨日期、跨区域或正式报告,建议使用经过辐射定标和大气校正的地表反射率产品。

常见建议如下:

  • 使用 Landsat Collection 2 Surface Reflectance 产品。
  • 使用 Sentinel-2 Level-2A 地表反射率产品。
  • 如果只有 Level-1 数据,应先完成大气校正或说明误差来源。
  • 多时相 NDVI 对比时,应尽量选择同一传感器、同一季节、相近成像条件的数据。

步骤三:在 QGIS 中用栅格计算器计算 NDVI

在 QGIS 中计算 NDVI归一化植被指数,可以使用“栅格计算器”。以 Sentinel-2 为例,Red 为 Band 4,NIR 为 Band 8,表达式可以写成:

("B8@1" - "B4@1") / ("B8@1" + "B4@1")

基本操作流程:

  1. 将红光波段和近红外波段加载到 QGIS。
  2. 打开“栅格”菜单中的“栅格计算器”。
  3. 输入 NDVI计算公式。
  4. 设置输出路径和输出格式,建议使用 GeoTIFF。
  5. 运行后检查输出栅格的最小值和最大值是否大致在 -1 到 1 之间。
  6. 给结果设置合适的颜色带,例如低值为棕色或灰色,高值为绿色。

如果输出结果出现极端大值、全黑、全白或大量空值,通常说明波段选错、数据类型处理不当、NoData 没处理好,或者输入影像范围不一致。

步骤四:在 ArcGIS Pro 中用栅格函数或栅格计算器计算

在 ArcGIS Pro 中,可以使用 Raster Calculator 或栅格函数来计算 NDVI。假设近红外图层为 NIR,红光图层为 Red,表达式为:

Float("NIR" - "Red") / Float("NIR" + "Red")

使用 Float 的目的是避免整数除法导致结果异常。如果输入是整数型栅格,直接相除可能得到不符合预期的结果。

ArcGIS Pro 中也可以使用内置 NDVI 栅格函数。它的优点是配置方便、可视化快速;缺点是初学者可能忽略具体波段对应关系。因此,即使用工具自动计算,也建议手动确认 Red 和 NIR 的输入是否正确。

步骤五:用 Python 批量计算 NDVI

如果需要批量处理多景影像,可以使用 Python 的 rasterio 库。下面是一个简化示例,适合已对齐、同分辨率、同范围的红光和近红外 GeoTIFF:

import rasterio
import numpy as np

red_path = "red.tif"
nir_path = "nir.tif"
out_path = "ndvi.tif"

with rasterio.open(red_path) as red_src:
    red = red_src.read(1).astype("float32")
    profile = red_src.profile

with rasterio.open(nir_path) as nir_src:
    nir = nir_src.read(1).astype("float32")

denominator = nir + red
ndvi = np.where(denominator == 0, np.nan, (nir - red) / denominator)

profile.update(dtype=rasterio.float32, count=1, nodata=np.nan)

with rasterio.open(out_path, "w", **profile) as dst:
    dst.write(ndvi.astype("float32"), 1)

这个示例中特别处理了分母为 0 的情况,避免生成无穷大结果。实际项目中还应检查 NoData、投影、像元大小和栅格对齐情况。

常见坑:NDVI值看起来不对时先检查这些问题

坑一:把红光和近红外波段选反

如果把 Red 和 NIR 选反,NDVI值可能整体变成负值,植被区域反而显得很低。遇到这种情况,应先查看原始影像波段说明,而不是急着调整颜色带。

坑二:用错不同卫星的波段编号

Landsat 8/9 的 NIR 是 Band 5,但 Sentinel-2 常用 NIR 是 Band 8。不同传感器不能简单套用同一个波段编号。NDVI计算公式虽然一样,但波段输入必须根据数据源确认。

坑三:未处理 NoData 和云

云、云影、影像边缘 NoData 会明显干扰 NDVI 结果。尤其在区域统计时,如果没有先进行云掩膜或 NoData 处理,平均 NDVI 会被拉低或产生异常。

坑四:直接比较不同季节的 NDVI

植被具有明显季节性。春季、夏季、秋季的 NDVI差异可能来自物候变化,而不一定是生态退化或作物受损。做变化分析时,应尽量选择相同季节或同一生长期影像。

坑五:忽略 NDVI 饱和问题

在高覆盖、高叶面积指数的森林或茂密作物区,NDVI 可能出现饱和现象,也就是植被继续变好,但 NDVI 提升不明显。此时可以考虑结合 EVI、NDRE、LAI 或其他指标分析。

方法比较:NDVI 与其他植被指数怎么选

NDVI归一化植被指数的优点是简单、稳定、资料多、可解释性强。但它不是所有植被问题的最佳答案。下面是几个常见植被指数的简单比较:

指标 主要用途 优点 局限
NDVI 通用植被覆盖和长势分析 公式简单,数据需求低,应用广泛。 高植被覆盖区易饱和,受土壤背景和大气影响。
EVI 高植被覆盖区和大气影响较明显场景 对高覆盖植被更敏感,改善部分大气影响。 需要蓝光波段,公式更复杂。
SAVI 稀疏植被和裸土背景明显区域 能减弱土壤背景影响。 需要设置土壤调节参数。
NDRE 农作物氮素和中后期长势监测 对部分作物中后期状态更敏感。 需要红边波段,不是所有影像都有。

如果你的目标是快速判断植被覆盖变化,NDVI 通常足够。如果研究区是茂密森林或高产农田,且你关心更细微的植被活力差异,可以考虑引入 EVI 或红边相关指数。

检查清单:发布 NDVI 分析结果前应确认什么

  • 是否确认了数据源和传感器类型。
  • 是否查清 Red 和 NIR 的正确波段编号。
  • 是否使用了地表反射率数据,或明确说明使用 DN 值的限制。
  • 是否完成云、云影、NoData 区域处理。
  • 输出 NDVI值是否主要落在 -1 到 1 范围内。
  • 是否检查了结果图层的坐标系、范围和像元大小。
  • 是否使用合理的颜色带,而不是让颜色误导判断。
  • 区域统计前是否排除了水体、建筑、云和无效值。
  • 多时相对比是否选择了相近季节或相同生长期。
  • 结论中是否避免把 NDVI 直接等同于产量、 biomass 或植被面积。

FAQ:NDVI归一化植被指数常见问题

1. NDVI值越高就一定代表植被越好吗?

不一定。一般来说,较高 NDVI值常表示较强植被信号,但它也受季节、地物类型、传感器、大气校正、土壤背景和云影影响。不同区域之间比较时,必须保证数据条件尽量一致。

2. NDVI计算公式中的 NIR 和 Red 可以用任意近红外、红光波段吗?

不能随意替换。应根据具体传感器的波段定义选择对应的红光和近红外波段。尤其是 Sentinel-2 有多个近红外或红边相关波段,常规 NDVI 一般使用 Band 8 作为 NIR,Band 4 作为 Red。

3. 为什么我算出的 NDVI 不在 -1 到 1 之间?

常见原因包括波段选错、输入数据未转为浮点数、NoData 未处理、分母接近 0、影像未正确对齐,或者使用了不合适的比例因子。应先检查原始波段值范围和计算表达式。

4. 用 NDVI 可以直接提取植被面积吗?

可以作为一种简化方法,但不能机械套用固定阈值。不同地区和季节的阈值不同。更稳妥的做法是结合样本点、目视解译、土地利用数据或分类模型确定阈值。

5. NDVI 和绿地率有什么区别?

NDVI 是从遥感影像计算出的植被指数,表达植被光谱响应;绿地率通常是规划或土地利用统计指标,表达某类绿地面积占比。两者相关,但不是同一个概念。

6. 做 NDVI 时间序列分析需要注意什么?

应尽量使用同一传感器或经过一致化处理的数据,保持相近季节或生长期,处理云和云影,并避免将单景影像中的异常值直接解释为趋势变化。

结论:正确理解 NDVI,比会点击工具更重要

NDVI归一化植被指数的核心并不复杂:利用近红外和红光反射差异,通过 NDVI计算公式得到 -1 到 1 之间的植被指数结果。它简单、直观、应用广泛,是 GIS 和遥感分析中非常适合入门和实战的指标。

但在真实项目中,NDVI 的价值取决于数据质量和解释方式。计算前要确认波段,计算中要处理 NoData、云和数据类型,计算后要结合地物、季节和区域背景解释 NDVI值。只有这样,NDVI 结果才不只是漂亮的绿色图层,而是可以支撑空间分析和业务判断的可靠信息。