我有两个光栅图像,一个来自波段4的末尾带有B4,另一个来自波段5的末尾带有B5。我想将B5栅格子集为800x600,然后显示并将其另存为GeoTiff。然后,我想计算NDVI(我想我需要B4和B5来做到这一点,但不确定)。然后,我想显示B5栅格的NDVI子集。显示它并将其另存为GeoTiff。
如何创建类似TIFF栅格图像的800 x 600像素子集的东西?我还想获取该TIFF并为该子集生成NDVI图像。
注意:我正在处理Landsat图像。该图像在文件标题的末尾带有B5。
到目前为止我所做的:
import rasterio
from rasterio.windows import Window
import matplotlib.pyplot plt # for later use
with rasterio.open('MyRasterImage.tif') as src:
w = src.read(1, window=Window(0, 0, 800, 600))
我想使用Spyder或Jupyter笔记本显示它。所以我想使用matplotlib并执行以下代码:
# Plot
plt.imshow(w)
plt.show()
这样做会生成一个800x600的matplotlib窗口,但是它全是紫色的,不确定为什么会产生这个窗口。
现在,我希望能够显示此800x600图像。然后在那之后,我要在该子集800x600图像上执行NDVI。然后显示带有NDVI的800x600子集图像。
我知道formuala是:NDVI =(NIR-红色)/(NIR +红色)
但是如何从这张Landsat图像中提取NIR和红色呢?
我的尝试:
band1 = dataset.read(1)
band2 = dataset.read(2)
band3 = dataset.read(3)
print(band[2])
当我为乐队运行该代码时,我得到了错误:
rasterio indexerror: band index 2 out of range (not in (1,))
当我运行此代码时:
print(w.count)
它返回“ 1”。
那么这意味着Landsat图像只有一个波段吗?但是要进行NDVI,我不需要3个频段吗?
我正在考虑编写这样的代码以从该栅格中获取NDVI。但不确定如何提取频段:
# We handle the connections with "with"
with rasterio.open(bands[0]) as src:
b3 = src.read(1)
with rasterio.open(bands[1]) as src:
b4 = src.read(1)
# Allow division by zero
numpy.seterr(divide='ignore', invalid='ignore')
# Calculate NDVI
ndvi = (b4.astype(float) - b3.astype(float)) / (b4 + b3)
此代码不起作用,因为没有将频段定义为任何东西,所以我不知道如何定义频段以获取NDVI。
此后,我不确定如何同时显示显示的图像和保存图像。