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

本文介绍了遥感tif图像中遇到的背景值问题,包括NAN和-inf,分析了产生原因并提供了解决过程。通过Python的GDAL库读取图像,利用条件判断和numpy函数,有效地忽略了异常值进行均值和最值的计算。
Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

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


前言

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

图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读取遥感影像中可能出现的背景,空值等异常的的情景。在这种情况下,可以忽略这些值进行计算。

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值