提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
遥感影像由于卫星轨道的原因,经过初步地理校正通常都是倾斜的,存储为数组形式时,会出现部分背景。今天在处理数据时,由于计算波段指数中存在log(x)函数中x存在负值,导致部份非背景像元出现值为空值(NAN)的情况,并且背景像元值为-inf。今天记录下出现这种情况数组的处理方法。

一、背景值为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读取遥感影像中可能出现的背景,空值等异常的的情景。在这种情况下,可以忽略这些值进行计算。
本文介绍了遥感tif图像中遇到的背景值问题,包括NAN和-inf,分析了产生原因并提供了解决过程。通过Python的GDAL库读取图像,利用条件判断和numpy函数,有效地忽略了异常值进行均值和最值的计算。
1588

被折叠的 条评论
为什么被折叠?



