归一化植被指数是啥?NDVI如何计算?

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

很多刚接触遥感和GIS的同学都会问:归一化植被指数是啥?NDVI如何计算? 简单说,NDVI是一种用红光波段和近红外波段判断植被生长状况的遥感指数,常用于农情监测、生态评估、城市绿化分析和土地覆盖变化识别。

归一化植被指数NDVI如何计算 红光波段近红外波段示意图
NDVI通常由近红外波段和红光波段计算得到,可用于快速识别植被覆盖和长势差异。

引言:NDVI解决的是“哪里有植被、长得好不好”的问题

在GIS和遥感分析中,我们经常需要回答几个实际问题:一块农田是否缺水?城市公园的植被覆盖是否下降?某片区域是裸地还是草地?如果只看普通真彩色影像,很多时候判断并不稳定。

归一化植被指数,也就是NDVI,正是为这类问题服务的。它利用植物叶片对不同波段光谱反射特征的差异,把植被信息转换成一个相对直观的数值范围。

对于GIS读者来说,理解NDVI不只是记住一个公式,还要知道用哪个波段、结果怎么解释、为什么有时算出来不准,以及在QGIS、ArcGIS Pro或Python中如何检查计算结果。

背景:归一化植被指数是啥

NDVI的英文全称是Normalized Difference Vegetation Index,中文通常叫归一化植被指数。它是一种基于遥感影像波段计算的植被指数。

绿色植物有一个典型光谱特征:在红光波段吸收较强,因为植物需要利用红光进行光合作用;在近红外波段反射较强,因为健康叶片内部结构会强烈反射近红外光。

因此,当一个像元内有健康植被时,近红外反射率通常较高,红光反射率较低。NDVI就是把这种差异用一个标准化公式表达出来。

NDVI常见用途

  • 农田长势监测:判断作物生长差异、缺水或病虫害风险区域。
  • 生态环境评估:分析草地、林地和湿地植被覆盖变化。
  • 城市绿地分析:提取公园、绿带、行道树等植被分布。
  • 土地覆盖分类辅助:区分植被、裸地、水体和建设用地。
  • 灾害评估:比较火灾、干旱、洪涝前后的植被恢复情况。

原理:NDVI如何计算

NDVI的标准计算公式如下:

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

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

这个公式的核心思想是:用近红外和红光的差值突出植被信号,再用两者之和进行归一化,减少光照强弱、地形阴影和传感器整体亮度差异带来的影响。

NDVI的取值范围怎么理解

理论上,NDVI的取值范围在-1到1之间。实际解释时可以参考下面的经验范围,但不要把它当成绝对分类标准。

NDVI范围 常见地物或状态 解释建议
小于0 水体、云、雪、部分阴影 通常不是健康植被,需要结合影像和掩膜检查
0到0.2 裸地、建设用地、稀疏植被 植被信号较弱,容易与土壤背景混合
0.2到0.5 草地、农田、一般植被 具有明显植被特征,可用于覆盖度分析
0.5以上 茂密森林、长势较好的作物 植被生长较旺盛,但高覆盖区域可能出现饱和

不同卫星影像对应的NDVI波段

计算NDVI最容易出错的地方是选错波段。不同卫星传感器的红光和近红外波段编号并不一样。

数据源 红光波段 近红外波段 NDVI表达式示例
Landsat 8 / Landsat 9 OLI Band 4 Band 5 (B5 – B4) / (B5 + B4)
Sentinel-2 MSI Band 4 Band 8 (B8 – B4) / (B8 + B4)
MODIS Red NIR (NIR – Red) / (NIR + Red)

如果你使用的是其他商业卫星、无人机多光谱影像或处理后的栅格产品,一定要先查看元数据,确认哪个波段是Red,哪个波段是NIR。

步骤:用QGIS计算NDVI

下面以QGIS为例,说明如何从多光谱影像计算归一化植被指数。这个流程适合Sentinel-2、Landsat和无人机多光谱栅格数据。

步骤1:准备红光和近红外波段

  1. 打开QGIS。
  2. 加载红光波段栅格,例如Sentinel-2的B04。
  3. 加载近红外波段栅格,例如Sentinel-2的B08。
  4. 检查两个栅格是否覆盖同一区域。
  5. 检查像元大小是否一致,例如10米、30米或其他分辨率。

如果两个波段的坐标系、范围或分辨率不同,建议先进行重投影、裁剪或重采样。否则NDVI结果可能出现错位、边缘异常或大面积空值。

步骤2:打开栅格计算器

  1. 在QGIS菜单中选择栅格
  2. 打开栅格计算器
  3. 在表达式区域输入NDVI公式。
  4. 设置输出文件路径,建议保存为GeoTIFF格式。
  5. 确认输出坐标系和范围。

步骤3:输入NDVI计算表达式

如果你的近红外波段图层名为B08,红光波段图层名为B04,可以使用类似表达式:

("B08@1" - "B04@1") / ("B08@1" + "B04@1")

如果使用Landsat 8或Landsat 9,常见表达式是:

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

图层名称可能与你的数据文件名不同,实际输入时应以QGIS栅格计算器中列出的波段名称为准。

步骤4:设置结果渲染样式

NDVI计算完成后,结果通常是一幅单波段浮点型栅格。为了更容易看出植被分布,可以设置伪彩色渲染。

  1. 右键NDVI结果图层,打开属性
  2. 进入符号系统
  3. 选择单波段伪彩色
  4. 设置最小值为-1,最大值为1,或使用实际统计值。
  5. 可以设置低值为灰色或褐色,高值为绿色。

渲染颜色只影响显示效果,不改变NDVI的真实像元值。做统计分析时,应使用原始NDVI栅格值,而不是截图颜色。

步骤5:验证NDVI结果是否合理

计算完成后不要急着出图,建议先做三个检查:

  • 查看水体区域:NDVI通常应接近0或小于0。
  • 查看密集植被区域:NDVI通常应明显高于裸地和建筑区。
  • 查看影像边缘和云区:异常值、空值和云影可能影响统计。

如果城市建筑区域出现大面积高NDVI,或者健康农田区域NDVI明显为负,通常说明波段选错、数据未对齐、云影未处理或影像产品本身不适合直接计算。

步骤:用Python快速计算NDVI

如果你需要批量处理大量影像,可以使用Python计算NDVI。下面示例使用Rasterio读取红光和近红外波段,并输出GeoTIFF。

import rasterio
import numpy as np

red_path = "B04.tif"
nir_path = "B08.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")

np.seterr(divide="ignore", invalid="ignore")
ndvi = (nir - red) / (nir + red)

ndvi[(nir + red) == 0] = np.nan

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)

这段代码适合红光和近红外波段已经完成配准、裁剪和重采样的情况。如果两个栅格的行列数、范围或分辨率不同,需要先统一栅格网格。

常见坑:NDVI计算不准通常不是公式问题

坑1:红光和近红外波段选反

NDVI公式是(NIR – Red) / (NIR + Red)。如果写成了(Red – NIR) / (Red + NIR),植被区域会变成负值,结果解释完全相反。

坑2:不同传感器波段编号混用

Sentinel-2的近红外常用B8,Landsat 8的近红外是B5。不要把一个数据源的波段编号直接套到另一个数据源上。

坑3:没有做大气校正或使用了不合适产品

严格的植被时序分析通常应优先使用地表反射率产品,而不是未经校正的原始数字量化值。不同日期、不同传感器之间对比时,这一点尤其重要。

坑4:云、云影和水体没有掩膜

云、云影、水体和雪会显著干扰NDVI结果。如果你的目标是统计植被长势,应先进行云掩膜、水体掩膜或质量控制。

坑5:把NDVI当作植被覆盖度本身

NDVI可以反映植被活力和覆盖状况,但它不是严格意义上的植被覆盖度。裸土背景、冠层结构、传感器角度和土壤湿度都会影响NDVI值。

坑6:高植被覆盖区域出现饱和

在茂密森林或高覆盖农田中,NDVI可能对进一步的长势变化不够敏感。这种情况可以考虑EVI、SAVI等其他植被指数作为补充。

方法比较:NDVI、EVI和SAVI怎么选

NDVI是最常用的植被指数,但不是所有场景都只用NDVI。不同指数适合不同问题。

指数 适用场景 优点 限制
NDVI 常规植被识别、农田长势、生态监测 公式简单,资料多,软件支持广 高覆盖区域可能饱和,受土壤背景影响
EVI 高植被覆盖区域、森林监测 对高生物量区域更敏感,能减弱部分大气影响 需要蓝光波段,公式更复杂
SAVI 稀疏植被、裸土背景明显区域 能减弱土壤背景干扰 需要设置土壤调节参数

如果你刚开始做植被分析,建议先用NDVI建立基础判断;如果发现结果受裸土或高覆盖饱和影响明显,再考虑引入其他植被指数。

检查清单:计算NDVI前后要确认什么

  • 是否确认了数据源,例如Sentinel-2、Landsat或无人机多光谱影像。
  • 是否确认了红光波段和近红外波段。
  • 两个波段是否具有相同坐标系、分辨率、范围和行列数。
  • 是否使用了适合分析目的的反射率产品。
  • 是否处理了云、云影、水体和无效值。
  • NDVI公式是否写成了(NIR – Red) / (NIR + Red)。
  • 结果值是否大致落在-1到1之间。
  • 植被、水体、裸地和建筑区的NDVI值是否符合常识。
  • 是否避免只根据颜色判断结果,而是查看真实像元值。
  • 是否在报告中说明数据日期、数据源、波段和处理流程。

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

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

不一定。一般情况下,NDVI越高说明植被信号越强,但它还会受到土壤背景、地形阴影、大气条件、作物类型和传感器差异影响。跨区域或跨日期比较时,应保持数据源和处理流程一致。

NDVI可以直接用来提取植被范围吗?

可以作为植被提取的重要依据,但不建议只依赖一个固定阈值。不同地区、季节和影像条件下,阈值会变化。更稳妥的方法是结合样本、目视检查、土地利用数据或分类模型。

Sentinel-2计算NDVI用B8还是B8A?

常规10米NDVI通常使用B8作为近红外波段,红光使用B4。如果研究需要使用窄近红外波段或与特定产品匹配,也可能使用B8A,但B8A空间分辨率为20米,通常需要重采样后再参与计算。

Landsat 8计算NDVI为什么用B5和B4?

Landsat 8和Landsat 9 OLI中,B4是红光波段,B5是近红外波段。因此NDVI表达式通常是(B5 – B4) / (B5 + B4)。这与早期Landsat传感器的波段编号不同,使用前要确认传感器类型。

NDVI结果为什么出现大于1或小于-1的值?

常见原因包括输入数据不是可直接用于计算的反射率、存在异常无效值、未正确处理NoData,或者波段没有对齐。建议先查看原始波段统计值,并检查NoData、缩放系数和数据类型。

用QGIS计算NDVI时需要先把影像转成浮点型吗?

QGIS栅格计算器通常可以输出浮点结果,但如果输入数据带有缩放系数或整数存储,最好确认实际参与计算的值是否为正确反射率。输出NDVI时建议保存为浮点型GeoTIFF。

结论:理解波段和数据质量,比背公式更重要

归一化植被指数NDVI的公式并不复杂,核心就是利用近红外和红光波段的差异来突出植被信息。真正影响结果质量的,往往是波段选择、数据预处理、云影掩膜、坐标对齐和结果验证。

在实际GIS项目中,建议把NDVI当作一个可解释、可验证的遥感指标,而不是简单的“一键绿度图”。只要确认数据源、选对红光和近红外波段,并认真检查结果,NDVI就能成为植被监测和空间分析中非常实用的基础工具。