Sự cố khi tính toán NDVI bằng Rasterio Python
Tôi đang cố gắng tính toán NDVI bằng cách sử dụng hai hình ảnh raster được cắt bớt của Landsat 7 (NIR & Red Bands được cắt bằng tệp mặt nạ) bằng cách sử dụng mã sau:
import rasterio as rio
import numpy as np
import matplotlib.pyplot as plt
with rio.open(r'D:\clip_test_b3.tif') as src:
red = src.read(1) # (Rows, Columns) = (2731, 3660)
with rio.open(r'D:\clip_test_b4.tif') as src:
nir = src.read(1) # (Rows, Columns) = (2730, 3635)
np.seterr(divide = 'ignore', invalid = 'ignore')
ndvi = (nir.astype(float) - red.astype(float))/(nir + red)
plt.imshow(ndvi)
Trong đoạn mã trên, cả hai dải (Red & NIR) có hình dạng khác nhau (các hàng và cột khác nhau). Sau khi chạy đoạn mã trên, tôi nhận được thông báo "ValueError: không thể phát các toán hạng cùng với các hình dạng (2730,3635) (2731,3660)".
Nhưng khi tính toán NDVI tương tự mà tôi đang cố gắng thực hiện trong ArcMap (sử dụng Máy tính Raster), thì NDVI sẽ được tính toán.
Ai đó có thể vui lòng giúp tôi trong việc giải quyết lỗi này.
Trả lời
Để giải quyết vấn đề của bạn, bạn cần đảm bảo các lưới bao phủ cùng một khu vực và có cùng kích thước. Một phương pháp để đạt được điều này là sử dụng phương thức reproject_match trong rioxarray(phần mở rộng xarray không gian địa lý được cung cấp bởi rasterio).
import rioxarray
red = rioxarray.open_rasterio("D:\clip_test_b3.tif")
nir_original = rioxarray.open_rasterio("D:\clip_test_b4.tif")
nir = nir_original.rio.reproject_match(red)
ndvi = (nir.astype(float) - red.astype(float))/(nir + red)
ndvi.plot()