NDVI计算公式是什么?波段该如何选择?

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

NDVI计算公式是什么?波段该如何选择? 这是很多 GIS 初学者在做植被监测、作物长势分析、生态评价时最先遇到的问题。NDVI 看起来只是一个简单公式,但如果近红外波段和红光波段选错,结果可能会整体偏低、范围异常,甚至把水体、裸地和植被判断反了。

本文以 QGIS、ArcGIS Pro 和常见遥感影像为使用场景,讲清楚 NDVI 计算公式、不同卫星影像的波段选择方法、结果检查方式,以及实际操作中最容易踩的坑。

NDVI计算公式是什么 NDVI波段选择示意图
NDVI 的核心是正确选择近红外波段和红光波段,再按公式计算植被指数。

引言:NDVI计算公式是什么

NDVI 的全称是 Normalized Difference Vegetation Index,中文通常叫归一化植被指数。它利用绿色植被在红光波段吸收强、在近红外波段反射强的特性,衡量地表植被覆盖和生长状况。

标准 NDVI 计算公式为:

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

其中:

  • NIR:近红外波段反射率。
  • Red:红光波段反射率。
  • NDVI:理论范围一般在 -1 到 1 之间。

从公式可以看出,NDVI 计算并不是随便拿两个波段相减相除,而是必须使用近红外波段红光波段。这也是“NDVI波段该如何选择”这个问题的关键。

背景:为什么NDVI波段选择容易出错

很多 NDVI 结果异常,并不是公式写错,而是波段选错。常见原因有三个。

第一,不同卫星的波段编号不同。例如 Sentinel-2 的红光波段是 B4,近红外波段是 B8;Landsat 8/9 的红光波段是 Band 4,近红外波段是 Band 5。不能简单认为“第 4 波段一定是近红外”。

第二,影像产品可能已经做过不同级别的处理。有些是原始数字量化值,有些是表观反射率,有些是地表反射率。如果直接混用不同处理级别的波段,NDVI 计算结果会不稳定。

第三,软件显示的波段顺序和文件命名可能不一致。尤其是多波段 GeoTIFF、ENVI 格式影像或经过重采样、裁剪、合成后的影像,波段名称可能丢失,只剩 Band 1、Band 2、Band 3 这样的默认编号。

判断 NDVI 是否可靠,不能只看图像“变绿了没有”,还要检查波段来源、数值范围和典型地物的 NDVI 值是否合理。

原理:NDVI为什么使用近红外和红光波段

健康植被中的叶绿素会强烈吸收红光,用于光合作用;同时,植物叶片细胞结构会强烈反射近红外光。因此,健康植被通常表现为Red 值较低、NIR 值较高

把这个特征代入 NDVI 计算公式:

  • 健康植被:NIR 高、Red 低,NDVI 接近正值,通常较高。
  • 裸地或建设用地:NIR 和 Red 差异不大,NDVI 通常接近 0。
  • 水体:近红外反射很低,NDVI 常为负值。
  • 云、雪、阴影:数值可能异常,需要结合掩膜或目视检查。

NDVI 使用归一化差值,是为了减弱部分光照条件、地形阴影和整体亮度差异的影响。但它不能完全替代大气校正、云掩膜和地形校正。因此,在严肃的变化监测或年度对比中,应优先使用地表反射率产品。

步骤:NDVI波段该如何选择并完成计算

1. 先确认影像来源和传感器

计算 NDVI 前,先确认影像来自哪个卫星或传感器。常见数据的红光和近红外波段如下:

数据源 红光波段 Red 近红外波段 NIR 常见说明
Sentinel-2 MSI B4 B8 常用于 10 米分辨率 NDVI
Landsat 8/9 OLI Band 4 Band 5 常见地表反射率产品可直接用于指数计算
Landsat 5 TM Band 3 Band 4 历史长时间序列分析常用
Landsat 7 ETM+ Band 3 Band 4 需注意 SLC-off 条带问题
MODIS Red 波段 NIR 波段 产品命名需按具体数据集说明确认

如果你使用的是无人机多光谱影像,也要查看相机说明书或影像元数据,确认哪个通道是红光,哪个通道是近红外。不要只凭 RGB 显示顺序判断。

2. 确认波段是否为同一范围、同一分辨率、同一投影

NDVI 计算要求 Red 和 NIR 在空间上严格对应。计算前建议检查:

  • 两个波段是否来自同一景影像。
  • 像元大小是否一致。
  • 坐标系是否一致。
  • 行列数是否一致。
  • 是否已经完成配准、裁剪或重采样。

以 Sentinel-2 为例,B4 和 B8 都是 10 米分辨率,适合直接计算 NDVI。但如果你使用 B8A,它是窄近红外波段,空间分辨率通常不同,需要先重采样,并确认是否符合你的研究目的。

3. 在 QGIS 中计算 NDVI

在 QGIS 中,可以使用栅格计算器完成 NDVI 计算。基本流程如下:

  1. 加载包含 Red 和 NIR 的遥感影像。
  2. 打开“栅格”菜单中的“栅格计算器”。
  3. 找到红光波段和近红外波段对应的图层或波段。
  4. 输入 NDVI 表达式。
  5. 设置输出路径和输出格式,建议保存为 GeoTIFF。
  6. 运行后检查输出 NDVI 栅格的最小值、最大值和渲染效果。

如果 Red 和 NIR 是两个单独文件,表达式类似:

("NIR@1" - "Red@1") / ("NIR@1" + "Red@1")

如果是多波段影像,需要根据实际波段编号修改。例如某个 Landsat 8 多波段栅格中 Band 4 是 Red,Band 5 是 NIR,则表达式可能类似:

("landsat_stack@5" - "landsat_stack@4") / ("landsat_stack@5" + "landsat_stack@4")

这里的关键不是照抄表达式,而是确认 @5 是否真的代表近红外,@4 是否真的代表红光

4. 在 ArcGIS Pro 中计算 NDVI

ArcGIS Pro 中可以使用 Raster Calculator、栅格函数或影像分析工具计算 NDVI。使用 Raster Calculator 时,表达式逻辑相同:

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

加入 Float 的目的是避免整数运算导致结果被截断。对于 0 到 10000 缩放的反射率产品,公式仍然成立,因为分子和分母会同时受到比例因子影响。但如果存在 NoData、云、阴影或饱和像元,仍需要先做掩膜处理。

5. 用 Python 计算 NDVI

如果需要批量处理大量影像,可以使用 Python 的 Rasterio。下面是一个简化示例,适合 Red 和 NIR 为两个单波段 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, rasterio.open(nir_path) as nir_src:
    red = red_src.read(1).astype("float32")
    nir = nir_src.read(1).astype("float32")

    profile = red_src.profile
    profile.update(dtype=rasterio.float32, count=1, nodata=-9999)

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

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

这个示例重点处理了分母为 0 和无效值问题。真实项目中还应检查两幅影像的投影、范围、分辨率是否一致。

常见坑:NDVI计算结果异常怎么排查

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

如果把 Red 和 NIR 放反,公式会变成:

(Red - NIR) / (Red + NIR)

这会使健康植被变成负值,结果方向完全相反。判断方法很简单:选一片明显植被区域,正常 NDVI 应该为正值,且通常高于裸地和建筑区。

坑二:直接用真彩色影像计算 NDVI

普通 RGB 真彩色影像通常只有红、绿、蓝三个可见光波段,没有近红外波段。没有 NIR,就不能计算标准 NDVI。网络地图截图、普通航拍照片、JPEG 图片一般不适合直接计算 NDVI。

坑三:没有做云和阴影处理

云、云影、积雪和传感器异常会影响 NDVI。尤其在多期对比中,如果某一期有云影,可能被误判为植被退化。建议使用质量控制波段、云掩膜产品或手动掩膜排除异常区域。

坑四:输出数据类型不对

NDVI 是小数值,通常位于 -1 到 1。如果输出为整数类型,结果可能被截断为 -1、0、1,失去分析意义。输出栅格应使用 Float32 等浮点类型。

坑五:没有检查 NoData

NoData 参与运算后可能生成极端值或空洞。计算前后都要检查 NoData 设置,尤其是经过裁剪、镶嵌和投影转换后的影像。

方法比较:QGIS、ArcGIS Pro、Python计算NDVI怎么选

方法 适合场景 优点 注意点
QGIS 栅格计算器 单景或少量影像 NDVI 计算 免费、操作直观、适合教学和快速验证 需要手动确认波段编号和输出类型
ArcGIS Pro Raster Calculator 工程化制图、空间分析流程 与地理数据库、模型构建器结合方便 注意 Float 运算和许可环境
Python Rasterio 批量处理、自动化生产 可重复、可脚本化、适合大批量影像 需要处理投影、重采样、NoData 和异常值
遥感云平台 大范围、多时相分析 减少本地下载压力,适合时间序列 需理解平台数据集、比例因子和掩膜规则

如果你只是学习 NDVI 计算公式和波段选择,建议先用 QGIS 做一景影像练习;如果要做长期监测或批量生产,再转向 Python 或云平台工作流。

检查清单:计算NDVI前后必须确认的事项

  • 是否明确影像来源和传感器名称。
  • 是否确认 Red 和 NIR 的真实波段编号。
  • Red 和 NIR 是否来自同一景或同一处理级别产品。
  • 两个波段的坐标系、分辨率、范围和行列数是否一致。
  • 是否使用浮点型输出 NDVI。
  • 是否处理了 NoData、云、云影、雪和异常像元。
  • NDVI 结果范围是否大致在 -1 到 1。
  • 植被、水体、裸地、建筑区的 NDVI 相对大小是否符合常识。
  • 是否保存了计算表达式、数据来源和处理日期,便于复现。

一个可靠的 NDVI 结果,不仅要公式正确,还要能解释数据来源、波段选择和质量控制过程。

FAQ:关于NDVI计算公式和波段选择的常见问题

1. NDVI计算公式一定是 NIR 减 Red 吗?

是的,标准 NDVI 计算公式是 (NIR - Red) / (NIR + Red)。如果写成 (Red - NIR) / (Red + NIR),结果符号会反过来,健康植被通常会变成负值。

2. Sentinel-2计算NDVI应该选哪个波段?

常规 Sentinel-2 NDVI 通常使用 B8 作为近红外波段,B4 作为红光波段,公式为 (B8 - B4) / (B8 + B4)。如果使用 B8A,需要注意其波段含义和空间分辨率,并根据项目要求进行重采样。

3. Landsat 8和Landsat 9计算NDVI用哪些波段?

Landsat 8/9 OLI 通常使用 Band 5 作为近红外波段,Band 4 作为红光波段,公式为 (Band 5 - Band 4) / (Band 5 + Band 4)。如果使用地表反射率产品,仍要注意云掩膜和质量控制波段。

4. RGB照片可以计算NDVI吗?

普通 RGB 照片不能计算标准 NDVI,因为缺少近红外波段。只有包含 NIR 通道的多光谱影像,才适合按标准 NDVI 公式计算。

5. NDVI结果为什么超过1或小于-1?

理论上 NDVI 通常应在 -1 到 1 之间。若明显超出范围,可能是波段缩放、NoData、数据类型、异常像元或表达式设置错误导致的。应优先检查输入波段是否正确、分母是否接近 0、输出是否为浮点类型。

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

不一定。NDVI 高通常表示植被覆盖或活性较强,但它会受到植被类型、土壤背景、冠层饱和、季节变化、大气条件和水分状况影响。做专业分析时,应结合研究区背景、时相、样点和其他指数综合判断。

结论:先选对波段,再谈NDVI结果解释

NDVI计算公式是什么?波段该如何选择? 核心答案很明确:NDVI 使用 (NIR - Red) / (NIR + Red),其中 NIR 必须是近红外波段,Red 必须是红光波段。不同卫星的波段编号不同,计算前一定要查清楚数据源和波段说明。

在实际 GIS 工作中,NDVI 计算的难点不在公式本身,而在数据质量控制、波段确认、NoData 处理和结果验证。只要按“确认传感器、选择正确波段、检查空间一致性、使用浮点计算、验证典型地物”的流程执行,NDVI 结果就会更可靠,也更适合后续的植被监测和空间分析。