• 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)。

    1. img_array1=np.random.randint(-10000,10000,(10,10))
    2. img_array2=np.random.randint(-10000,10000,(10,10))
    3. print(img_array1)
    4. print(img_array2)

    生成两个数组分别为:

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

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

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

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

    1. ###数组加减乘除运算 数组和常数的加减乘除,省略
    2. plus_array=img_array1+img_array2
    3. print("plus_array:")
    4. print(plus_array)
    5. minus_array=img_array1-img_array2
    6. print("minus_array:")
    7. print(minus_array)
    8. multiply_array=img_array1*img_array2
    9. print("multiply_array:")
    10. print(multiply_array)
    11. divide_array=img_array1/img_array2
    12. print("divide_array:")
    13. print(divide_array)

    计算结果:

    1. plus_array:
    2. [[-39998 -39998 -39998 -39998 -39998 -39998 -39998 -39998 -39998 -39998]
    3. [-39998 -39998 -39998 -39998 -39998 -39998 -39998 -39998 -39998 -39998]
    4. [-39998 -39998 12893 7314 -12197 -4117 12573 6194 -39998 -39998]
    5. [-39998 -39998 -5553 -9860 -1198 119 796 -15450 -39998 -39998]
    6. [-39998 -39998 -4898 -10383 2332 -14781 -1009 11782 -39998 -39998]
    7. [-39998 -39998 14040 -3803 -5629 -2954 -7742 4466 -39998 -39998]
    8. [-39998 -39998 4689 2696 9065 3754 10020 2697 -39998 -39998]
    9. [-39998 -39998 16966 2685 -980 -5393 10307 -4255 -39998 -39998]
    10. [-39998 -39998 -39998 -39998 -39998 -39998 -39998 -39998 -39998 -39998]
    11. [-39998 -39998 -39998 -39998 -39998 -39998 -39998 -39998 -39998 -39998]]
    12. minus_array:
    13. [[ 0 0 0 0 0 0 0 0 0 0]
    14. [ 0 0 0 0 0 0 0 0 0 0]
    15. [ 0 0 -4601 8900 6649 -5355 -5989 12278 0 0]
    16. [ 0 0 5071 -3862 15254 12619 11722 4130 0 0]
    17. [ 0 0 4820 -317 8464 -4957 9073 -4880 0 0]
    18. [ 0 0 3436 10715 -2339 -13504 -10796 844 0 0]
    19. [ 0 0 -3089 -15204 9035 4210 -7386 13335 0 0]
    20. [ 0 0 184 -15469 -17518 10203 8673 3573 0 0]
    21. [ 0 0 0 0 0 0 0 0 0 0]
    22. [ 0 0 0 0 0 0 0 0 0 0]]
    23. multiply_array:
    24. [[399960001 399960001 399960001 399960001 399960001 399960001 399960001
    25. 399960001 399960001 399960001]
    26. [399960001 399960001 399960001 399960001 399960001 399960001 399960001
    27. 399960001 399960001 399960001]
    28. [399960001 399960001 36265062 -6428851 26139402 -2931584 30553052
    29. -28095912 399960001 399960001]
    30. [399960001 399960001 1280192 20576139 -57812328 -39806250 -34192917
    31. 55411400 399960001 399960001]
    32. [399960001 399960001 189501 26926550 -16550268 48476528 -20325312
    33. 28750281 399960001 399960001]
    34. [399960001 399960001 46328876 -25087104 6553680 -43407975 -14153763
    35. 4808205 399960001 399960001]
    36. [399960001 399960001 3111200 -55973300 135750 -907896 11461851
    37. -42637104 399960001 399960001]
    38. [399960001 399960001 71952825 -58020184 -76479981 -18754190 7753330
    39. 1334674 399960001 399960001]
    40. [399960001 399960001 399960001 399960001 399960001 399960001 399960001
    41. 399960001 399960001 399960001]
    42. [399960001 399960001 399960001 399960001 399960001 399960001 399960001
    43. 399960001 399960001 399960001]]
    44. divide_array:
    45. [[ 1.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00
    46. 1.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00
    47. 1.00000000e+00 1.00000000e+00]
    48. [ 1.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00
    49. 1.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00
    50. 1.00000000e+00 1.00000000e+00]
    51. [ 1.00000000e+00 1.00000000e+00 4.73991083e-01 -1.02232030e+01
    52. 2.94386077e-01 -7.65105008e+00 3.54703157e-01 -3.03616042e+00
    53. 1.00000000e+00 1.00000000e+00]
    54. [ 1.00000000e+00 1.00000000e+00 4.53689759e-02 2.28776259e+00
    55. -8.54364211e-01 -1.01904000e+00 -1.14570749e+00 5.78140960e-01
    56. 1.00000000e+00 1.00000000e+00]
    57. [ 1.00000000e+00 1.00000000e+00 8.02634287e-03 1.06298430e+00
    58. -1.76060013e+00 2.00916124e+00 -7.99841301e-01 4.14235986e-01
    59. 1.00000000e+00 1.00000000e+00]
    60. [ 1.00000000e+00 1.00000000e+00 1.64805734e+00 -4.76098636e-01
    61. 2.42188450e+00 -1.56000000e+00 -6.07007204e+00 1.46604086e+00
    62. 1.00000000e+00 1.00000000e+00]
    63. [ 1.00000000e+00 1.00000000e+00 2.05708408e-01 -6.98770950e-01
    64. 6.03333333e+02 -1.74649123e+01 1.51327129e-01 -1.50705020e+00
    65. 1.00000000e+00 1.00000000e+00]
    66. [ 1.00000000e+00 1.00000000e+00 1.02192826e+00 -7.04197422e-01
    67. -1.11851494e+00 -3.08412413e-01 1.16156671e+01 8.71231477e-02
    68. 1.00000000e+00 1.00000000e+00]
    69. [ 1.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00
    70. 1.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00
    71. 1.00000000e+00 1.00000000e+00]
    72. [ 1.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00
    73. 1.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00
    74. 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:

    1. end_array=end_array*location_array
    2. end_array=np.where(end_array== 0, -19999, end_array)
  • 相关阅读:
    【算法训练-二叉树 二】【重建二叉树】依据前序与中序遍历序列重建二叉树
    让终端命令更有时间观念
    Vue框架学习记录之环境安装与第一个Vue项目
    SQL血缘解析原理
    【2023Q3_技术考核经验】
    每日三题 11.14
    vs2019+Qt 使用 Qlabel 在界面上显示图像及显示失真问题
    LeetCode 55. 跳跃游戏
    redis List常用命令整理
    Unity UGUI的Slider(滑动条)件组的介绍及使用
  • 原文地址:https://blog.csdn.net/soderayer/article/details/125518739