首页 GIS基础理论 QGIS栅格计算器咋用?NDVI公式怎么写?

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

作者: GIS研习社 更新时间:2025-12-18 02:00:56 分类:GIS基础理论

NDVI算出来全是黑的?别慌,90%的人第一步就错了

你是否也遇到过在QGIS里用栅格计算器算NDVI,结果拉伸了半天还是一片漆黑?或者数值范围莫名其妙跑到-100到+300?别怀疑人生——这不是软件bug,而是你漏掉了最关键的一步:波段值归一化。我在参与某省植被覆盖动态监测项目时,第一次批量处理200景Landsat影像,也栽在这个坑里,差点被甲方骂哭。

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

NDVI的本质:用数学给植物“测体温”

NDVI(归一化植被指数)听起来高大上,其实原理比奶茶配方还简单。它就是用近红外波段(NIR)减去红光波段(Red),再除以它们的和。公式长这样:

(NIR - Red) / (NIR + Red)

为什么这么设计?因为健康植物会狂吸红光(用于光合作用),同时猛反射近红外(细胞结构散射)。就像人发烧时额头温度高,植被“发烧”(茂盛)时近红外反射率就飙升。这个公式本质是计算“反射差值占总反射的比例”,所以结果被强制压缩在-1到+1之间——这才是关键!如果你直接用原始DN值(比如0~10000)计算,分母动辄上万,结果自然小到看不见。

💡 类比教学:想象你在称体重。如果直接用“克”为单位(比如65000克),数字太大不方便比较;但换成“千克”(65kg),瞬间清爽。NDVI的归一化就是把波段值从“克”转成“千克”。

手把手实战:三步写出不会报错的NDVI公式

我们以Landsat 8为例(其他卫星同理),假设你已加载影像且确认波段顺序:

  1. 定位波段:右键图层 → 属性 → 信息,找到红光波段(通常是B4)和近红外波段(B5)。记下它们在QGIS中的编号,比如raster@4raster@5
  2. 写公式:打开栅格 → 栅格计算器,输入:
    ( "LC08_raster@5" - "LC08_raster@4" ) / ( "LC08_raster@5" + "LC08_raster@4" )
    注意:波段名必须加双引号+反斜杠转义!这是新手最高频的报错点。
  3. 设置输出:指定输出路径,勾选添加结果到工程,点击运行

跑完后右键新图层 → 属性 → 渲染,将拉伸方式改为最小/最大,你会看到经典的NDVI色彩:红色=裸土,绿色=茂密植被。

避坑指南:Dr.Gis的三个血泪经验

  • 坑1:忘记云掩膜 —— 云层的NDVI接近0,会污染统计结果。先用QA波段或手动裁剪剔除云区。
  • 坑2:波段搞反 —— 把红光当近红外?结果会得到负值为主的“反NDVI”。务必核对卫星波段表!
  • 坑3:数据类型陷阱 —— 如果输出选了Int16,小数会被截断成0。务必选Float32!
常见卫星NDVI波段组合红光波段近红外波段
Landsat 8/9Band 4Band 5
Sentinel-2Band 4Band 8
MODISBand 1Band 2

进阶技巧:用条件函数排除无效值

想让水体/云层显示为透明?在公式里嵌套if函数:

if( ("raster@5" + "raster@4") = 0, -9999, ("raster@5" - "raster@4") / ("raster@5" + "raster@4") )
这句的意思是:如果分母为0(避免除零错误),输出-9999(设为NoData值);否则正常计算NDVI。之后在图层样式里将-9999设为透明即可。

总结:NDVI计算的核心就两句话

第一,波段值必须归一化——要么用反射率产品,要么自己除以最大值(如Landsat 8除10000);第二,公式要带转义符——波段名必须用" "包裹。做到这两点,黑色诅咒自动解除。

你在计算NDVI时还遇到过哪些诡异报错?是在第几步卡住的?欢迎在评论区甩出你的截图+问题,我会抽三个典型case做深度解析!

相关文章