使用python库Rasterio创建TIFF图像的子集,然后显示并保存吗?

时间:2018-11-18 16:16:38

标签: python rasterio

我有两个光栅图像,一个来自波段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。

此后,我不确定如何同时显示显示的图像和保存图像。

0 个答案:

没有答案