Sự cố khi tính toán NDVI bằng Rasterio Python

Sep 19 2020

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

4 snowman2 Sep 19 2020 at 07:52

Để 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()