python - 将 Boxcar 平均值应用于地理空间图像
问题描述
假设以下数组A
是读取 GeoTIFF 图像的结果,例如使用 rasterio,其中 nodata 值被屏蔽,即数组B
。
我想在一个方形社区上应用一个棚车平均平滑。第一个问题是我不确定哪个 scipy 函数代表 boxcar 平均值?
我认为它可能是 ndimage.uniform_filter。但是,与 scipy.signal 相比,ndimage 不适用于掩码数组。
from scipy.signal import medfilt
from scipy.ndimage import uniform_filter
import numpy as np
A = np.array([[-9999, -9999, -9999, -9999, -9999, -9999, -9999, -9999],
[-9999, -9999, -9999, -9999, -9999, -9999, -9999, -9999],
[-9999, -9999, -9999, -9999, -9999, -9999, -9999, -9999],
[-9999, -9999, -9999, 0, 300, 400, 200, -9999],
[-9999, -9999, -9999, -9999, 200, 0, 400, -9999],
[-9999, -9999, -9999, 300, 0, 0, -9999, -9999],
[-9999, -9999, -9999, 300, 0, -9999, -9999, -9999],
[-9999, -9999, -9999, -9999, -9999, -9999, -9999, -9999]])
B = np.ma.masked_array(A, mask=(A == -9999))
print(B)
filtered = medfilt(B, 3).astype('int')
result = np.ma.masked_array(filtered, mask=(filtered == -9999))
print(result)
boxcar = ndimage.uniform_filter(B)
print(boxcar)
那么,我如何应用一个占 nodata 值的 boxcar 平均值,例如scipy.signal.medfilt?
解决方案
这似乎是一个很好的解决方案:
import numpy as np
from scipy.signal import fftconvolve
def boxcar(A, nodata, window_size=3):
mask = (A==nodata)
K = np.ones((window_size, window_size),dtype=int)
out = np.round(fftconvolve(np.where(mask,0,A), K, mode="same")/fftconvolve(~mask,K, mode="same"), 2)
out[mask] = nodata
return np.ma.masked_array(out, mask=(out == nodata))
A = np.array([[100, 100, 100, 100, 100, 100, 100, 100],
[100, 100, 100, 100, 100, 100, 100, 100],
[100, 100, 100, 100, 100, 100, 100, 100],
[100, 100, 100, 100, 1 , 0 , 1 , 100],
[100, 100, 100, 1 , 0 , 1 , 0 , 100],
[100, 100, 100, 0 , 1 , 0 , 1 , 100],
[100, 100, 100, 100, 100, 100, 100, 100]])
print(boxcar(A, 100))
很高兴获得一些反馈,特别是在改进方面!
推荐阅读
- hive - Sqoop 增量导入后 Hive 表过期
- javascript - 如何在不更改文件名的情况下遍历 JS 中的文件夹
- python - 如何从 Google Cloud 函数返回 JSON
- environment-variables - 在 HELM 中为 DEV、PRESTAGING、STAGING 和 PROD 设置单独的环境变量值
- angular - 在角度中使用发射输出属性优于 viewchild 的优势
- ruby-on-rails - 无法连接到 OpenTok。响应代码:创建会话时身份验证失败
- javascript - document.getElemetById 返回 TypeError: Cannot set property 'checked' of undefined
- python - 关于 Python 的 tfidf 和 word-cloud
- mongodb - 为 mongo-go-driver 动态创建聚合管道
- git - git不添加来自不同git目录的文件