【问题标题】:How to show negative values in an NDVI image?如何在 NDVI 图像中显示负值?
【发布时间】:2021-05-21 00:14:45
【问题描述】:

我对 python 还很陌生。我正在使用一些 Landsat 8 .tiff 图像来生成 NDVI 图像。当我生成图像时,河流不会显示为负值。 NDVI 从 -1 变为 1,但在此图像中它达到的最低值为 0。这是我使用的代码的一部分:

import os
from glob import glob

import sys
import numpy as np 
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap  
import rasterio as rio 
from rasterio.plot import plotting_extent 
import rioxarray as rxr
import geopandas as gpd 
import earthpy as et  
import earthpy.spatial as es  
import earthpy.plot as ep 
#create image stack
arr_st, meta = es.stack(stack_bands_path, nodata = -9999)

#allow division by 0
np.seterr(divide='ignore', invalid='ignore')

#create NDVI
red = arr_st[3].astype(float)
nir = arr_st[4].astype(float)

ndvi = np.divide((nir-red), (nir+red))
ep.plot_bands(ndvi, cmap="RdYlGn", cols=1, vmin=-1, vmax=1)
plt.show()

我不确定我做错了什么。我最初使用的是 earthpy.spatial.normalized_difference 但河流呈绿色(或颜色条上的 1)。

我的理论是小于 0 的数字显示为零……但我不确定。任何帮助表示赞赏。 NDVI的图像如下。

NDVI image

【问题讨论】:

  • 测试一下:print(np.all(nir>=red))
  • 它说“假”。这意味着没有 NIR 值大于或等于红色......这意味着我应该得到负的 NDVI 值,对吧?

标签: python arrays numpy image-processing


【解决方案1】:

NDVI 将落在 -1+1 的范围内,因此整数不是一个好的表示,因为在该范围内只有 3 个可能的整数结果,即 -1、0 和 1。

我不熟悉您正在使用的特定包,但是,如果您想要小数(十进制)结果,我想您会想要使用 float 类型,即:

red = arr_st[3].astype(float)
nir = arr_st[4].astype(float)

【讨论】:

  • 我试过了,但它仍然没有显示任何负值。无论如何,谢谢。
  • 您没有提供带有import 声明和代表性图片的“最小完整可验证示例”,因此很难为您提供帮助。尝试检查ndvi.min()ndvi.max() 以在显示之前查看数据的范围。请记住,PNG 格式不能存储负值。尝试通过 ndvi=((ndvi+1)*127).astype(np.uint8) 将数据重新缩放到 0..255 范围
  • 啊,我明白了!对不起。我最终确实想到了做最大值和最小值,结果是 6673 和 -1。因为我使用的是 numpy,所以我做了 np.max(ndvi)。我也在处理 tiff 文件。我编辑了我的问题以包含导入语句。
  • 如果您的 max 超过 1,您就出错了。ab 没有这样的值 (a-b)/(a+b) > 1
  • 是的,我知道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-11
  • 1970-01-01
相关资源
最近更新 更多