重采样篇③:二维数组忽略0值的平均值重采样(针对遥感影像转为的数组)

本文介绍了如何使用Python和numpy库将9×9的9米分辨率遥感影像重采样为3×3的30米分辨率影像。重采样过程中,对每个新像素的值,计算其对应原区域的非零像素值之和并除以非零像素数目,实现平均值重采样。提供了详细的代码实现和步骤解析。
摘要由CSDN通过智能技术生成

关键词:平均值,忽略0,重采样,numpy,切片,python

分辨率为10m的遥感影像读出的数组origin_arr的性状为9×9,如何通过不遍历的方式将其重采样为30m分辨率,形状为3×3的数组target_arr呢?

 

结果数组中每个数都是原数组对应区域的和除以对应区域格子总数与值为0的格子数目的差,例如:4.9=(2+5+0+4+2+8+4+9+5)/(9-1),即结果数组中的一个格子对应原来数组的9个格子。

在python中,可以利用numpy的切片取出9个格子的左上位置,left_up_arr = origin_arr[0:9:3, 0:9:3],结果为:

 

同理,可以取出另外8个位置:

正上方位置 center_up_arr = origin_arr[0:9:3, 1:9:3]

右上方位置 right_up_arr = origin_arr[0:9:3, 2:9:3]

左边位置 left_center_arr = origin_arr[1:9:3, 0:9:3]

正中位置 center_arr = origin_arr[1:9:3, 1:9:3]

右边位置 right_center_arr = origin_arr[1:9:3, 2:9:3]

左下方位置 left_bottom_arr = origin_arr[2:9:3, 0:9:3]

正下方位置 center_bottom_arr = origin_arr[2:9:3, 1:9:3]

右下方位置 right_bottom_arr = origin_arr[2:9:3, 2:9:3]

上面这些数组大小与target_arr形状相同。

将上面这些数组求和得到求和数组sum_arr;

在最开始时创建一个数组大小为3×3,值为9的数组用于计数,每取出一个位置后进行判断,如果某格子值为0,计数数组对应格子减1;

最后将求和数组与计数数组相除,即可得到结果数组。

整理后完成代码,完整平均值重采样函数如下:

def lessen_scale(origin_arr, r1, r2, mode='sum'):
    """
    把h1行w1列的分辨率为r1矩阵重采样为h2行w2列的分辨率为r2矩阵
    :return:返回结果矩阵
    """
    h1, w1 = np.shape(origin_arr)
    scale = int(r2 / r1)
    h2 = int(h1 * r1 / r2)
    w2 = int(w1 * r1 / r2)
    num_arr = np.zeros((h2, w2))
    num_arr[num_arr == 0.0] = scale ** 2
    sum_arr = np.zeros((h2, w2))
    for i in range(scale):
      for j in range(scale):
        part_arr = origin_arr[i:h2*scale:scale, j:w2*scale:scale]
        sum_arr += part_arr
        num_arr[part_arr == 0] -= 1
    target_arr = sum_arr / num_arr
    target_arr[np.isnan(target_arr)] = 0
    return target_arr, h2, w2
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值