Dividir dos arreglos numpy resultando exclusivamente en NaNs.
import rasterio
import numpy as np
path = '/Users/me/Desktop/'
filename = '*.tif'
with rasterio.open(path + filename) as src:
band_red_radiance = src.read(3)
with rasterio.open(path + filename) as src:
band_nir_radiance = src.read(4)
nir = np.array(band_red_radiance)
red = np.array(band_nir_radiance)
nir.dtype # uint16
np.seterr(divide='ignore', invalid='ignore')
ndvi = np.divide(np.subtract(red, nir), np.add(red, nir))
ndvi.max()
ndvi.min()
Puedo sumar y restar estas matrices sin problemas, pero no puedo dividirlas. Estoy utilizando los operadores propios de numpy para evitar problemas cuando los datos no son tipo float (son uint-16), pero incluso cuando los convierto a float, obtengo un mínimo y máximo de NaN.
import rasterio
import numpy as np
path = '/Users/me/Desktop/'
filename = '*.tif'
with rasterio.open(path + filename) as src:
band_red_radiance = src.read(3)
with rasterio.open(path + filename) as src:
band_nir_radiance = src.read(4)
nir = np.array(band_red_radiance)
red = np.array(band_nir_radiance)
nir.dtype # uint16
np.seterr(divide='ignore', invalid='ignore')
ndvi = np.divide(np.subtract(red, nir), np.add(red, nir))
ndvi.max()
ndvi.min()
davy.ai
El problema en este código está en la operación de división en el cálculo de ndvi. Los valores de red y nir son ambos de tipo uint-16, lo que significa que cualquier valor mayor a 65535 no se representará adecuadamente. Por lo tanto, al restar red de nir, es posible obtener valores negativos que no se pueden representar como uint-16. De manera similar, al sumar red y nir, es posible obtener valores mayores a 65535. Dado que el cálculo de ndvi implica dividir estos valores, el resultado será NaN (no es un número) para cualquier valor que no se pueda representar adecuadamente como uint-16.
Para solucionar este problema, los valores de red y nir deben ser convertidos a float antes de realizar cualquier cálculo. Esto evitará cualquier problema con valores negativos o fuera de rango. Aquí tienes una versión actualizada del código:
Al convertir los valores de red y nir a float, la operación de división manejará adecuadamente cualquier valor fuera de rango, y el cálculo de ndvi debería producir resultados válidos.