NDVI计算公式是什么?波段该如何选择?
NDVI计算公式是什么?波段该如何选择? 这是很多 GIS 初学者在做植被监测、作物长势分析、生态评价时最先遇到的问题。NDVI 看起来只是一个简单公式,但如果近红外波段和红光波段选错,结果可能会整体偏低、范围异常,甚至把水体、裸地和植被判断反了。
本文以 QGIS、ArcGIS Pro 和常见遥感影像为使用场景,讲清楚 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 计算。基本流程如下:
- 加载包含 Red 和 NIR 的遥感影像。
- 打开“栅格”菜单中的“栅格计算器”。
- 找到红光波段和近红外波段对应的图层或波段。
- 输入 NDVI 表达式。
- 设置输出路径和输出格式,建议保存为 GeoTIFF。
- 运行后检查输出 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 结果就会更可靠,也更适合后续的植被监测和空间分析。