章节2:你的第一个遥感植被指数
这次,我们提取NDVI指数(归一化植被指数)
from __future__ import print_function
#加载GDAL模块和GDAL_ARRAY模块,用来处理图像
from osgeo import gdal
from osgeo import gdal_array
#加载numpy模块,用numpy数组来存储影像
import numpy as np
#打开一个GDAL dataset对象
dataset = gdal.Open('tiffbigcut.tif',gdal.GA_ReadOnly)
#获取数据类型,这都是上期的内容
image_datatype = dataset.GetRasterBand(1).DataType
image = np.zeros((dataset.RasterYSize,dataset.RasterXSize,dataset.RasterCount),
dtype = gdal_array.GDALTypeCodeToNumericTypeCode(image_datatype))
for b in range(dataset.RasterCount):
band = dataset.GetRasterBand(b+1)
image[:, :, b] = band.ReadAsArray()
print('红波段均值:{r}'.format(r=image[:, :, 1].mean()))
print('绿波段均值{nir}'.format(nir=image[:, :, 2].mean()))
红波段均值:9813.603048859104
绿波段均值9703.108145345384
上述结果,我利用envi进行了验证,是正确的
至此,都是上一章已经详细介绍过的内容。下面我们开始计算NDVI。本教程针对的是有遥感基础和有一定python代码基础的人群,因此不详细的介绍其中的细节,着重于针对代码部分。
我们利用python标准运算操作来进行运算。因为这些运算都是向量化的(向量化的方法可以高效的计算矩阵运算且已经被专业人员高度优化运算速度很快)。永远不要在numpy数组上进行循环。
需要指出的是,我使用的tiff影像只有RGB三个波段,因此我没法计算ndvi指数,我只用蓝/红波段来替代,大家的影像如果有近红外波段的话,可以自行尝试。
#索引号,在我的影像数组中红波段位于1,蓝波段位于0
b_red = 1
b_blue = 0
fake_ndvi = (image[:, :, b_red] - image[:, :, b_blue])/(image[:, :, b_red]+image[ :, :, b_blue])
print("我的假冒ndvi:")
print(fake_ndvi)
print(fake_ndvi.max())
我的假冒ndvi:
[[3.39857651e+00 3.82498373e+00 7.87725892e-03 ... 3.30612658e+00
2.48525900e-03 3.56180208e-03]
[3.38035278e+00 3.71864056e+00 3.43958135e+00 ... 3.30948520e+00
7.44675570e-04 3.07021888e-03]
[3.61033543e+00 3.75790330e+00 3.74499363e+00 ... 3.32172454e+00
2.22739197e-03 3.26330756e+00]
...
[3.24653159e+00 3.23365924e+00 3.21870987e+00 ... 3.33962848e+00
2.98026135e+00 2.86922975e+00]
[3.24371046e+00 3.24211364e+00 3.23999602e+00 ... 3.14581319e+00
2.95903014e+00 2.94860678e+00]
[3.24006359e+00 3.24394369e+00 3.25370527e+00 ... 2.73324916e+00
2.79346294e+00 3.15362952e+00]]
296.44545454545454
好,至此ndvi就提取完毕了。非常的简单。但是这样提取的是不太准确的,因为既没有辐射定标,也没有大气校正,你这咋提嘛。
本章翻译完成。我要说说昨晚结束的歌手·当打之年的总决赛。你这不混音不修音没法听啊,这就是华语乐坛新一代的顶尖水平吗?徐佳莹的表演太令人失望,和《惊雷》一个级别的作品咋听吗?华晨宇全凭流量上位,吃相难看。你看看下面坐的大众评审,都是怀春少女,这还用投票吗?