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

引言: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:加载红光和近红外波段
- 打开 QGIS。
- 把红光波段和近红外波段拖入图层面板。
- 右键图层,打开属性,查看坐标参考系、像元大小、范围和 NoData 设置。
- 确认两个波段覆盖同一区域,并且分辨率一致。
如果你不确定哪个是红光、哪个是近红外,不要直接计算。应先查看数据说明文档、传感器波段表或影像产品元数据。
步骤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栅格计算器
- 在菜单栏点击 栅格。
- 选择 栅格计算器。
- 在左侧的栅格波段列表中找到红光和近红外图层。
- 双击波段名称,把它插入到表达式框中。
推荐通过双击插入图层名,不要手动敲完整名称。因为 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:设置输出文件和数据类型
- 在输出图层中选择保存路径,建议保存为
.tif。 - 文件名可以写成
ndvi.tif或study_area_ndvi.tif。 - 输出格式选择 GeoTIFF。
- 输出范围一般选择与输入图层一致。
- 输出分辨率应保持与原始波段一致。
- 输出数据类型建议使用 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 就会稳定很多,也更适合后续的植被覆盖分析、分区统计和专题制图。