Python GDAL+numpy遥感图像处理过程中背景像元处理方法

Posted 空中旋转篮球

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python GDAL+numpy遥感图像处理过程中背景像元处理方法相关的知识,希望对你有一定的参考价值。

我们在处理遥感图像过程中,经常要涉及到背景像元的处理,遥感影像通常采用规则矩形数组存储,而有效影像区域往往是不规则数据,这就涉及到背景像元值的处理问题。

大多软件对于遥感图像背景值处理是记为0值,也有的是-9999、-19999、nodata、nan等。

有些计算,背景值不影响计算结果,这里的计算结果是指影像区域的计算结果,背景值往往还是会产生变化的,但是有些变化是非0值计算为0值了,所以我们打开影像的时候显示也没多大变化。有些计算背景值会对计算产生错误结果,后面将详细介绍。

打个比方,以影像背景值为-19999为例,比如landsat的数据产品,有的就是以该值为背景值,这个值作为背景值可以有效区分影像中的0值,以零值为背景值就容易和影像中的0值混在一起。

我们使用numpy生成一个数组,将部分值手动修改为-19999,作为背景值。这里就不用gdal读取影像数据作为数组了,如有需要可以参考以前写的专栏文章:遥感图像处理https://blog.csdn.net/soderayer/category_11011395.html

下面我们使用numpy随机生成两个数组,就设置为10行10列吧。随机范围设置在(-10000,10000)。

img_array1=np.random.randint(-10000,10000,(10,10))
img_array2=np.random.randint(-10000,10000,(10,10))
print(img_array1)
print(img_array2)

生成两个数组分别为:

[[ 8721  7329 -2775 -6596  5229  7148  1385  1711   700 -7822]
 [ -816 -8182    30 -4158  5816 -5305  5669  5625  3552  -384]
 [-3565  5693  4146  8107 -2774 -4736  3292  9236   241 -8017]
 [ 2066 -9807  -241 -6861  7028  6369  6259 -5660 -1612  5498]
 [ 6978 -1917   -39 -5350  5398 -9869  4032  3451  6517 -3606]
 [-9431 -7302  8738  3456 -3984 -8229 -9269  2655 -3206  4163]
 [-7831  2560   800 -6254  9050  3982  1317  8016  5144  1791]
 [ 9465   773  8575 -6392 -9249  2405  9490  -341 -9153  7140]
 [ 2088     4  5321  9371 -9785 -5229  3681 -6103 -6100  1233]
 [-1987  3837  4125  3227  4257 -3267  7863  1640  -583 -7665]]
[[-7408 -1577  3365  5674 -7981 -9032  9326  6460 -4230  -859]
 [ 9197 -7282  6126 -2568  6494  7313 -1999 -2293  7415  7533]
 [ 7307 -6304  8747  -793 -9423   619  9281 -3042  4621   822]
 [ 7328  5918 -5312 -2999 -8226 -6250 -5463 -9790  -200 -7922]
 [ 7339  -974 -4859 -5033 -3066 -4912 -5041  8331 -8908  2473]
 [-7276  4051  5302 -7259 -1645  5275  1527  1811 -9701  4537]
 [-7924   719  3889  8950    15  -228  8703 -5319  -621  6546]
 [-9236  5188  8391  9077  8269 -7798   817 -3914  8359 -5854]
 [-9905  2167  1676 -3345  6357  2736 -3426  3897  8539  -552]
 [  162   766  8993   175  9677  1460  3250  -193 -5935  4897]]

我们将连个数组的外围两圈改为-19999:

rows=[0,1,8,9]
cols=[0,1,8,9]
for i in rows:
    for j in range(0,10):
        img_array1[i][j]=-19999
        img_array2[i][j] = -19999
for i in cols:
    for j in range(0,10):
        img_array1[j][i]=-19999
        img_array2[j][i] = -19999
[[-19999 -19999 -19999 -19999 -19999 -19999 -19999 -19999 -19999 -19999]
 [-19999 -19999 -19999 -19999 -19999 -19999 -19999 -19999 -19999 -19999]
 [-19999 -19999   4146   8107  -2774  -4736   3292   9236 -19999 -19999]
 [-19999 -19999   -241  -6861   7028   6369   6259  -5660 -19999 -19999]
 [-19999 -19999    -39  -5350   5398  -9869   4032   3451 -19999 -19999]
 [-19999 -19999   8738   3456  -3984  -8229  -9269   2655 -19999 -19999]
 [-19999 -19999    800  -6254   9050   3982   1317   8016 -19999 -19999]
 [-19999 -19999   8575  -6392  -9249   2405   9490   -341 -19999 -19999]
 [-19999 -19999 -19999 -19999 -19999 -19999 -19999 -19999 -19999 -19999]
 [-19999 -19999 -19999 -19999 -19999 -19999 -19999 -19999 -19999 -19999]]
[[-19999 -19999 -19999 -19999 -19999 -19999 -19999 -19999 -19999 -19999]
 [-19999 -19999 -19999 -19999 -19999 -19999 -19999 -19999 -19999 -19999]
 [-19999 -19999   8747   -793  -9423    619   9281  -3042 -19999 -19999]
 [-19999 -19999  -5312  -2999  -8226  -6250  -5463  -9790 -19999 -19999]
 [-19999 -19999  -4859  -5033  -3066  -4912  -5041   8331 -19999 -19999]
 [-19999 -19999   5302  -7259  -1645   5275   1527   1811 -19999 -19999]
 [-19999 -19999   3889   8950     15   -228   8703  -5319 -19999 -19999]
 [-19999 -19999   8391   9077   8269  -7798    817  -3914 -19999 -19999]
 [-19999 -19999 -19999 -19999 -19999 -19999 -19999 -19999 -19999 -19999]
 [-19999 -19999 -19999 -19999 -19999 -19999 -19999 -19999 -19999 -19999]]

遥感图像指数运算的本质其实就是数组加减乘除运算以及各种逻辑运算。下面是数组的加减乘除运算,其实就是数组中对应位置的数值的加减乘除运算。

###数组加减乘除运算   数组和常数的加减乘除,省略
plus_array=img_array1+img_array2
print("plus_array:")
print(plus_array)
minus_array=img_array1-img_array2
print("minus_array:")
print(minus_array)
multiply_array=img_array1*img_array2
print("multiply_array:")
print(multiply_array)
divide_array=img_array1/img_array2
print("divide_array:")
print(divide_array)

计算结果:

plus_array:
[[-39998 -39998 -39998 -39998 -39998 -39998 -39998 -39998 -39998 -39998]
 [-39998 -39998 -39998 -39998 -39998 -39998 -39998 -39998 -39998 -39998]
 [-39998 -39998  12893   7314 -12197  -4117  12573   6194 -39998 -39998]
 [-39998 -39998  -5553  -9860  -1198    119    796 -15450 -39998 -39998]
 [-39998 -39998  -4898 -10383   2332 -14781  -1009  11782 -39998 -39998]
 [-39998 -39998  14040  -3803  -5629  -2954  -7742   4466 -39998 -39998]
 [-39998 -39998   4689   2696   9065   3754  10020   2697 -39998 -39998]
 [-39998 -39998  16966   2685   -980  -5393  10307  -4255 -39998 -39998]
 [-39998 -39998 -39998 -39998 -39998 -39998 -39998 -39998 -39998 -39998]
 [-39998 -39998 -39998 -39998 -39998 -39998 -39998 -39998 -39998 -39998]]
minus_array:
[[     0      0      0      0      0      0      0      0      0      0]
 [     0      0      0      0      0      0      0      0      0      0]
 [     0      0  -4601   8900   6649  -5355  -5989  12278      0      0]
 [     0      0   5071  -3862  15254  12619  11722   4130      0      0]
 [     0      0   4820   -317   8464  -4957   9073  -4880      0      0]
 [     0      0   3436  10715  -2339 -13504 -10796    844      0      0]
 [     0      0  -3089 -15204   9035   4210  -7386  13335      0      0]
 [     0      0    184 -15469 -17518  10203   8673   3573      0      0]
 [     0      0      0      0      0      0      0      0      0      0]
 [     0      0      0      0      0      0      0      0      0      0]]
multiply_array:
[[399960001 399960001 399960001 399960001 399960001 399960001 399960001
  399960001 399960001 399960001]
 [399960001 399960001 399960001 399960001 399960001 399960001 399960001
  399960001 399960001 399960001]
 [399960001 399960001  36265062  -6428851  26139402  -2931584  30553052
  -28095912 399960001 399960001]
 [399960001 399960001   1280192  20576139 -57812328 -39806250 -34192917
   55411400 399960001 399960001]
 [399960001 399960001    189501  26926550 -16550268  48476528 -20325312
   28750281 399960001 399960001]
 [399960001 399960001  46328876 -25087104   6553680 -43407975 -14153763
    4808205 399960001 399960001]
 [399960001 399960001   3111200 -55973300    135750   -907896  11461851
  -42637104 399960001 399960001]
 [399960001 399960001  71952825 -58020184 -76479981 -18754190   7753330
    1334674 399960001 399960001]
 [399960001 399960001 399960001 399960001 399960001 399960001 399960001
  399960001 399960001 399960001]
 [399960001 399960001 399960001 399960001 399960001 399960001 399960001
  399960001 399960001 399960001]]
divide_array:
[[ 1.00000000e+00  1.00000000e+00  1.00000000e+00  1.00000000e+00
   1.00000000e+00  1.00000000e+00  1.00000000e+00  1.00000000e+00
   1.00000000e+00  1.00000000e+00]
 [ 1.00000000e+00  1.00000000e+00  1.00000000e+00  1.00000000e+00
   1.00000000e+00  1.00000000e+00  1.00000000e+00  1.00000000e+00
   1.00000000e+00  1.00000000e+00]
 [ 1.00000000e+00  1.00000000e+00  4.73991083e-01 -1.02232030e+01
   2.94386077e-01 -7.65105008e+00  3.54703157e-01 -3.03616042e+00
   1.00000000e+00  1.00000000e+00]
 [ 1.00000000e+00  1.00000000e+00  4.53689759e-02  2.28776259e+00
  -8.54364211e-01 -1.01904000e+00 -1.14570749e+00  5.78140960e-01
   1.00000000e+00  1.00000000e+00]
 [ 1.00000000e+00  1.00000000e+00  8.02634287e-03  1.06298430e+00
  -1.76060013e+00  2.00916124e+00 -7.99841301e-01  4.14235986e-01
   1.00000000e+00  1.00000000e+00]
 [ 1.00000000e+00  1.00000000e+00  1.64805734e+00 -4.76098636e-01
   2.42188450e+00 -1.56000000e+00 -6.07007204e+00  1.46604086e+00
   1.00000000e+00  1.00000000e+00]
 [ 1.00000000e+00  1.00000000e+00  2.05708408e-01 -6.98770950e-01
   6.03333333e+02 -1.74649123e+01  1.51327129e-01 -1.50705020e+00
   1.00000000e+00  1.00000000e+00]
 [ 1.00000000e+00  1.00000000e+00  1.02192826e+00 -7.04197422e-01
  -1.11851494e+00 -3.08412413e-01  1.16156671e+01  8.71231477e-02
   1.00000000e+00  1.00000000e+00]
 [ 1.00000000e+00  1.00000000e+00  1.00000000e+00  1.00000000e+00
   1.00000000e+00  1.00000000e+00  1.00000000e+00  1.00000000e+00
   1.00000000e+00  1.00000000e+00]
 [ 1.00000000e+00  1.00000000e+00  1.00000000e+00  1.00000000e+00
   1.00000000e+00  1.00000000e+00  1.00000000e+00  1.00000000e+00
   1.00000000e+00  1.00000000e+00]]

从上面计算结果中,我们可以看到背景像元值-19999的变化,背景数值会跟着计算产生各种变化,那么如何让这个背景值不产生变化呢?或者将背景值每次运算结果都保持为0值。

我们可以采用一下两种办法实现:

方法一:使用条件运算强行改变背景值

条件运算函数:np.where(三元运算符)

np.where(nparray == -19999, -19999, nparray+-*/n )

 以上代码含义是,如果数组的值等于-19999,就赋值为-19999,否则计算为新的数值,即只计算非背景数值.更复杂的运算就需要设置更多种条件运算了。

在arcgis中显示nodata的背景,我们使用gdal读取的时候可以认为是0值进行处理。

方法二:采用数据记录背景值位置,待所有计算完成之后从新赋值为背景值

依旧使用条件运算函数:np.where(三元运算符)

location_array=np.where(nparray == -19999, 0, 1)

 以上代码含义是,如果数组的值等于-19999,就赋值为0,否则为1.

所有计算完成之后,我们可以使用最后计算得到的数组,将背景值都赋值为0:

end_array=end_array*location_array

 或者保留-19999:

end_array=end_array*location_array
end_array=np.where(end_array== 0, -19999, end_array)

以上是关于Python GDAL+numpy遥感图像处理过程中背景像元处理方法的主要内容,如果未能解决你的问题,请参考以下文章

Python遥感图像处理应用篇(十八):GDAL +numpy对遥感图像归一化处理

Python遥感图像处理应用篇(十八):GDAL +numpy对遥感图像归一化处理

Python遥感图像处理应用篇(十九):GDAL +numpy批量对遥感图像外围背景值进行处理

Python遥感图像处理应用篇(十九):GDAL +numpy批量对遥感图像外围背景值进行处理

Python遥感图像处理应用篇(二十三):Python+GDAL 批量拼接图像

Python遥感图像处理应用篇(二十三):Python+GDAL 批量拼接图像