QGIS栅格计算器咋用?NDVI公式怎么写?

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

很多同学第一次做遥感植被指数时,会直接搜索“QGIS栅格计算器咋用?NDVI公式怎么写?”。这篇文章就围绕一个具体任务展开:在 QGIS 里用栅格计算器,根据红光波段和近红外波段计算 NDVI,并把结果保存为可继续分析的 GeoTIFF 栅格。

QGIS栅格计算器计算NDVI公式步骤示意图
QGIS栅格计算器计算 NDVI 的基本流程:加载波段、确认红光与近红外、输入公式、检查输出结果。

引言:QGIS栅格计算器适合解决什么问题

QGIS栅格计算器主要用于对一个或多个栅格图层进行像元级计算。所谓像元级计算,就是同一位置上的像元值按照公式逐格运算,常见用途包括 NDVI、NDBI、NDWI、坡度重分类、栅格掩膜和阈值提取。

本文重点讲 QGIS计算NDVI。NDVI 的全称是归一化植被指数,常用于快速判断植被覆盖状况。只要你手里有红光波段和近红外波段,就可以在 QGIS栅格计算器 中写出 NDVI公式。

NDVI 的标准公式是:NDVI = (NIR – Red) / (NIR + Red)。其中 NIR 是近红外波段,Red 是红光波段。

背景:为什么NDVI公式看起来简单,实际经常算错

NDVI公式本身不复杂,但在 QGIS 里出错的原因通常不是公式数学问题,而是数据和参数问题。最常见的情况有三类。

  • 红光波段和近红外波段选错:不同传感器的波段编号不同,不能只靠文件顺序判断。
  • 栅格没有对齐:两个波段的范围、分辨率、行列数或坐标系不一致,计算结果可能为空或错位。
  • 输出类型不合适:NDVI 是小数,范围通常在 -1 到 1 之间,如果输出成整型,结果可能被截断。

所以,正确使用 QGIS栅格计算器 的关键不是只记住一个表达式,而是先确认波段、空间对齐和输出数据类型。

原理:NDVI公式在QGIS栅格计算器里怎么理解

在 QGIS栅格计算器 中,每个栅格波段会以类似 "图层名@1" 的形式出现。这里的 @1 表示该栅格图层的第 1 个波段。如果你加载的是单波段 GeoTIFF,例如单独的红光波段文件,那么通常就是 "red@1"。如果你加载的是多波段影像,则需要确认红光和近红外分别对应哪个波段。

NDVI 的公式如下:

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

如果你的图层名不是 NIR 和 Red,就要替换成 QGIS 栅格计算器左侧列表里显示的真实名称。例如:

("LC08_B5@1" - "LC08_B4@1") / ("LC08_B5@1" + "LC08_B4@1")

这里假设 Landsat 8 的 B5 是近红外波段,B4 是红光波段。对于 Sentinel-2,常用的是 B8 作为近红外,B4 作为红光,但也要注意 10 米、20 米分辨率波段混用时的重采样问题。

步骤:用QGIS栅格计算器计算NDVI

步骤1:加载红光和近红外波段

  1. 打开 QGIS。
  2. 把红光波段和近红外波段拖入图层面板。
  3. 右键图层,打开属性,查看坐标参考系、像元大小、范围和 NoData 设置。
  4. 确认两个波段覆盖同一区域,并且分辨率一致。

如果你不确定哪个是红光、哪个是近红外,不要直接计算。应先查看数据说明文档、传感器波段表或影像产品元数据。

步骤2:确认常见传感器的红光和近红外波段

数据源 红光波段 近红外波段 常见NDVI公式写法
Landsat 8/9 OLI Band 4 Band 5 (B5 - B4) / (B5 + B4)
Landsat 5/7 Band 3 Band 4 (B4 - B3) / (B4 + B3)
Sentinel-2 MSI Band 4 Band 8 (B8 - B4) / (B8 + B4)
常见无人机多光谱 Red NIR (NIR - Red) / (NIR + Red)

表里的波段编号只是常见情况。实际项目中,仍建议以你下载数据时附带的元数据为准。

步骤3:打开QGIS栅格计算器

  1. 在菜单栏点击 栅格
  2. 选择 栅格计算器
  3. 在左侧的栅格波段列表中找到红光和近红外图层。
  4. 双击波段名称,把它插入到表达式框中。

推荐通过双击插入图层名,不要手动敲完整名称。因为 QGIS栅格计算器 对图层名称中的空格、中文、特殊符号比较敏感,手动输入容易漏引号或写错名称。

步骤4:输入NDVI公式

假设你的近红外图层显示为 "B8@1",红光图层显示为 "B4@1",则 QGIS栅格计算器表达式 可以写成:

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

如果是 Landsat 8 或 Landsat 9,常见写法是:

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

如果你的文件名比较长,例如:

("LC09_L2SP_123032_B5@1" - "LC09_L2SP_123032_B4@1") / ("LC09_L2SP_123032_B5@1" + "LC09_L2SP_123032_B4@1")

公式虽然长,但逻辑仍然是近红外减红光,再除以近红外加红光。

步骤5:设置输出文件和数据类型

  1. 在输出图层中选择保存路径,建议保存为 .tif
  2. 文件名可以写成 ndvi.tifstudy_area_ndvi.tif
  3. 输出格式选择 GeoTIFF。
  4. 输出范围一般选择与输入图层一致。
  5. 输出分辨率应保持与原始波段一致。
  6. 输出数据类型建议使用 Float32。

NDVI 是浮点数结果,如果使用 Byte、Int16 这类整型,可能导致小数丢失。对于 QGIS计算NDVI,Float32 是更稳妥的选择。

步骤6:运行并检查NDVI结果

点击确定后,QGIS 会生成 NDVI 栅格。结果生成后不要急着用于制图或统计,先做三项检查。

  • 值域检查:右键 NDVI 图层,查看统计信息,正常 NDVI 大多在 -1 到 1 之间。
  • 空间检查:确认 NDVI 图层与原始影像位置一致,没有偏移。
  • 视觉检查:给 NDVI 设置单波段伪彩色,查看植被区域是否呈现较高值。

如果 NDVI 出现大量极大值、极小值或整幅图都是 0,通常说明波段选错、数据类型不对、NoData 未处理,或者原始影像需要先做缩放系数处理。

常见坑:QGIS栅格计算器算NDVI时最容易错在哪

坑1:把红光和近红外写反

正确公式是 (NIR - Red) / (NIR + Red)。如果写成 (Red - NIR) / (NIR + Red),结果会整体反向,植被区域可能变成负值。

判断方法很简单:找一块明显的林地、农田或绿地,如果 NDVI 不是相对较高,就要检查 NDVI公式 是否写反。

坑2:直接用多波段影像但没确认波段号

有些影像是多波段合成文件,QGIS 里会显示为 "image@1""image@2""image@3"。这时不能假设 @1 就是红光,必须根据元数据确认每个波段含义。

如果你不确定多波段顺序,建议先把各波段拆分出来,重命名为 Red、NIR,再使用 QGIS栅格计算器 计算。

坑3:两个波段分辨率不一致

Sentinel-2 中不同波段可能有 10 米、20 米、60 米分辨率。虽然常用的 B4 和 B8 都是 10 米,但如果你计算其他指数,可能会混用不同分辨率波段。分辨率不一致时,应先重采样到同一像元大小。

在 QGIS 中可以使用 栅格 相关工具或处理工具箱中的重投影、对齐、重采样工具,让输入栅格具有相同的坐标系、分辨率和范围。

坑4:没有处理NoData和云区

遥感影像中的云、阴影、水体、边界空值都可能影响 NDVI。QGIS栅格计算器 只负责按公式计算,不会自动识别云区。如果原始数据没有云掩膜,计算结果可能在云区出现异常值。

对于正式分析,建议结合质量波段、云掩膜或研究区矢量边界进行裁剪和筛选。

坑5:反射率缩放系数没有处理

有些遥感产品的像元值不是直接反射率,而是经过缩放的整数值。对于 NDVI 这种比值指数,如果红光和近红外使用相同缩放方式,很多情况下比例关系不会改变;但如果涉及偏移量、不同产品层级或混合数据源,就需要按产品说明进行反射率转换。

如果你使用 Landsat Collection 2 Level-2 或 Sentinel-2 L2A 数据,建议先阅读产品文档,确认像元值、缩放系数和 NoData 值。

方法比较:QGIS栅格计算器、处理工具箱和Python怎么选

方法 适合场景 优点 限制
QGIS栅格计算器 单景影像、教学练习、小范围分析 上手快,公式直观,不需要写代码 批量处理不够方便,复杂流程容易重复操作
QGIS处理工具箱 需要标准化流程、模型构建 可与裁剪、重采样、掩膜等工具串联 需要理解参数和处理链
GDAL命令行 批量处理、服务器环境 自动化能力强,适合脚本化 对初学者不够直观
Python Rasterio 批处理、科研计算、结果质检 可控性强,便于和 NumPy、GeoPandas 结合 需要 Python 基础和环境配置

如果你只是想快速理解 QGIS栅格计算器咋用,并完成一次 NDVI 计算,用栅格计算器最合适。如果要处理几十景影像,建议进一步学习 QGIS 模型构建器、GDAL 或 Python Rasterio。

检查清单:计算NDVI前后逐项核对

计算前检查

  • 是否确认了红光波段和近红外波段?
  • 两个波段是否属于同一景影像、同一时间或同一产品?
  • 坐标系是否一致?
  • 像元大小是否一致?
  • 栅格范围是否一致或至少有有效重叠?
  • NoData 值是否明确?
  • 是否需要先裁剪研究区?

表达式检查

  • 公式是否为 (NIR - Red) / (NIR + Red)
  • 图层名是否带有英文双引号?
  • 波段编号是否正确,例如 @1@4@5
  • 括号是否完整?
  • 除号两边是否都是栅格表达式而不是普通文本?

输出检查

  • 输出格式是否为 GeoTIFF?
  • 输出数据类型是否为 Float32?
  • NDVI 值域是否大致在 -1 到 1?
  • 植被区域是否显示为较高值?
  • 结果是否与原始影像空间位置一致?

FAQ:QGIS栅格计算器和NDVI公式常见问题

QGIS栅格计算器里的“@1”是什么意思?

@1 表示该栅格图层的第 1 个波段。如果是单波段文件,通常只会用到 @1。如果是多波段影像,就可能有 @2@3@4 等,需要根据元数据确认具体含义。

QGIS计算NDVI为什么结果全是黑色?

不一定是计算错了。NDVI 是单波段浮点栅格,默认渲染可能看起来很暗。可以右键图层,进入符号系统,把渲染方式改为单波段伪彩色,并重新加载最小值和最大值。如果统计值异常,再检查公式、波段和数据类型。

NDVI结果一定在-1到1之间吗?

理论上 NDVI 通常在 -1 到 1 之间。但如果原始数据异常、NoData 未正确处理、缩放系数使用不当,或者红光和近红外不是同一套数据,结果可能超出这个范围。出现大量超范围值时要回到原始波段检查。

Sentinel-2在QGIS栅格计算器里的NDVI公式怎么写?

常用 Sentinel-2 NDVI公式 是 (B8 - B4) / (B8 + B4)。在 QGIS栅格计算器 中要写成图层实际名称,例如:

("T50XXX_B08@1" - "T50XXX_B04@1") / ("T50XXX_B08@1" + "T50XXX_B04@1")

实际名称以 QGIS 左侧栅格波段列表显示为准。

Landsat 8在QGIS里NDVI公式怎么写?

Landsat 8 和 Landsat 9 常用 Band 5 作为近红外,Band 4 作为红光,因此公式通常是:

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

如果你的图层名称包含完整文件名,需要用栅格计算器左侧列表中的真实名称替换。

为什么我输入公式后QGIS提示表达式无效?

常见原因包括图层名没有加双引号、括号不匹配、使用了中文括号、波段名称手动输入错误、图层已被重命名但表达式仍用旧名称。建议从左侧波段列表双击插入,不要手打图层名。

可以先裁剪影像再算NDVI吗?

可以,而且很多项目建议先裁剪研究区再计算。这样可以减少计算量,也方便后续统计。但要注意红光和近红外必须用同一个研究区边界裁剪,避免范围不一致。

结论:先确认波段,再写NDVI公式

QGIS栅格计算器 的核心用法并不复杂:选择正确的栅格波段,输入像元计算表达式,设置输出文件和数据类型。计算 NDVI 时,最重要的是确认近红外和红光波段,并使用 (NIR - Red) / (NIR + Red) 这个公式。

对于初学者,建议把流程固定为四步:先查波段表,再检查对齐,再用 QGIS栅格计算器表达式 计算,最后检查 NDVI 值域和空间位置。只要这几个环节不出错,QGIS计算NDVI 就会稳定很多,也更适合后续的植被覆盖分析、分区统计和专题制图。