遥感tif图像中如何忽略背景值为NAN或者-inf求均值和最值

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、背景值为NAN或者-inf的原因?
  • 二、解决过程
    • 1.背景值的两种情况
    • 2.例子
  • 总结


前言

遥感影像由于卫星轨道的原因,经过初步地理校正通常都是倾斜的,存储为数组形式时,会出现部分背景。今天在处理数据时,由于计算波段指数中存在log(x)函数中x存在负值,导致部份非背景像元出现值为空值(NAN)的情况,并且背景像元值为-inf。今天记录下出现这种情况数组的处理方法。
遥感tif图像中如何忽略背景值为NAN或者-inf求均值和最值_第1张图片

图1 遥感影像(黑色部分为背景)

一、背景值为NAN或者-inf的原因?

通常遥感影像的背景值为NAN或者0(根据导出数据方式软件算法不同而变化)。然而今天由于处理遥感影像时使用波段运算工具有log函数,log函数处理的少部分非背景像元为负值,因此波段运算得到值为NAN。这种情况下背景不能为NAN,用ENVI导出为tif格式后,使用python的GDAL读取到背景值变成-inf(python中规定为负无穷大)。但是计算影像均值,方差等数据时需要忽略背景值或者NAN值,因此有了今天这篇博客。

二、解决过程

1.背景值的两种情况

(1)在影像非背景像元中没有出现NAN,此时背景值为0(numpy数组中包括普通像元值与背景值0)
(2)在影像非背景像元中出现NAN,此时背景值为-inf(numpy数组中包括普通像元值(NAN与正常值)与背景值-inf)
这里只是列举出我遇到的两种情况,可能还有可能有其他情况,比如背景值为NAN,建议先用GDAL库读为numpy数组,然后具体查看背景值的状况。
解决思路:
第一种情况需要忽略背景值0,第二种情况需要忽略背景值为NAN与-inf。因此使用if判断影像属于那种情景就行。然后再根据不同情景,求均值与最值。

2.例子

使用GDAL库读取为numpy数组后:

判断数组arr属于哪种情况:

#假设使用gdal读取的数组分别为arr1与arr2,arr1对应第二种情况(背景为-inf),arr2对应第一种情况(背景为0)
arr1 = np.array([float('-inf'),np.nan,0,1,2,3,float('-inf')])
arr2 = np.array([1, 0, 0, 0, 1, 2, 3])
a = [arr1,arr2]
for arr in a:
    if len(np.where(arr == float('-inf'))[0]) and np.isnan(arr).any():
        temp = float('-inf')
        min = np.nanmin(arr[arr != temp])
        max = np.nanmax(arr[arr != temp])
        mean = np.nanmean(arr[arr != temp])
        print(max, min, mean)
    else:
        temp = float(0)
        min = np.nanmin(arr[arr != temp])
        max = np.nanmax(arr[arr != temp])
        mean = np.nanmean(arr[arr != temp])
        print(max, min, mean)

输出为:
3.0 0.0 1.5
3 1 1.75

这里讲解下代码arr[arr != temp]的意思,arr != temp返回的是和arr长度一致的数组,其元素值为布尔类型,True表示该元素值不等于 temp,False表示元素值等于 temp,arr[arr != temp]表示取其中元素值不等于temp的元素,返回新numpy数组。至于np.nanmin等函数即忽略数组中的NAN值。


总结

今天记录了实验过程中遇到使用GDAL读取遥感影像中可能出现的背景,空值等异常的的情景。在这种情况下,可以忽略这些值进行计算。

你可能感兴趣的:(遥感与深度学习,python,深度学习)