NDVI是什么
NDVI(归一化植被指数)是近红外波段的反射值与红光波段的反射值之差比上两者之和。即(NIR-R)/(NIR+R),NIR为近红外波段的反射值,R为红光波段的反射值。归一化植被指数是反映农作物长势和营养信息的重要参数之一。根据该参数,可以知道不同季节的农作物对氮的需求量, 对合理施用氮肥具有重要的指导作用。
- NDVI的应用:检测植被生长状态、植被覆盖度和消除部分辐射误差等;
- -1<=NDVI<=1,负值表示地面覆盖为云、水、雪等,对可见光高反射;0表示有岩石或裸土等,NIR和R近似相等;正值,表示有植被覆盖,且随覆盖度增大而增大;
- NDVI的局限性表现在,用非线性拉伸的方式增强了NIR和R的反射率的对比度。对于同一幅图象,分别求RVI和NDVI时会发现,RVI值增加的速度高于NDVI增加速度,即NDVI对高植被区具有较低的灵敏度;
- NDVI能反映出植物冠层的背景影响,如土壤、潮湿地面、雪、枯叶、粗糙度等,且与植被覆盖有关;
计算代码
注意使用的是哨兵2影像,第8波段为红外波段,第4波段为红光波段
from osgeo import gdal
import os
import time
import numpy as np
img_root = "E:\\商丘yx"
img_type = (".img", ".dat", "tiff")
driver = gdal.GetDriverByName('GTiff')
result_name_temp = "temp2.tiff"
start = time.clock()
result_path = os.path.join(img_root, result_name_temp)
# 文件存在则删除文件
if os.path.exists(result_path):
os.remove(result_path)
rater_file = "E:\\商丘yx\\t50smc_20190604t025551_b01.img"
def get_ndvi(path): # 计算某一影像的ndvi值,返回二维数组
dataset = gdal.Open(path)
cols = dataset.RasterXSize # 列数
rows = dataset.RasterYSize # 行数
band8 = dataset.GetRasterBand(8).ReadAsArray(0, 0, cols, rows)
band4 = dataset.GetRasterBand(4).ReadAsArray(0, 0, cols, rows)
molecule = band8 - band4
denominator = band8 + band4
del dataset
band = molecule / denominator
band[band > 1] = 9999 # 过滤异常值
return band
def compute_band(file):
dataset = gdal.Open(file)
cols = dataset.RasterXSize # 列数
rows = dataset.RasterYSize # 行数
# 生成影像
target_ds = gdal.GetDriverByName('GTiff').Create(result_path, xsize=cols, ysize=rows, bands=1,
eType=gdal.GDT_Float32)
target_ds.SetGeoTransform(dataset.GetGeoTransform())
target_ds.SetProjection(dataset.GetProjection())
del dataset
band = get_ndvi(file)
target_ds.GetRasterBand(1).SetNoDataValue(9999)
target_ds.GetRasterBand(1).WriteArray(band)
target_ds.FlushCache()
compute_band(rater_file)
elapsed = (time.clock() - start)
print("计算ndvi耗时:", elapsed)
计算前

计算结果

网友评论