Python二维插值(scipy.interpolate.interp2d)注意输入参数维度问题

问题描述

SGLI将数据的经纬度进行了重采样,例如本来是10001000的图像重采样到了100100像元,这导致在对影像插值时需要先把经/纬度重采样到1000*1000,本文主要记录在重采样中遇到的输入数据维度问题

scipy.interpolate.interp2d二维插值

scipy.interpolate.interp2d是我主要用到的方法,当然还有其他的二维插值方法本文并不涉及,我最开始采用了如下方法进行二维插值
https://zhuanlan.zhihu.com/p/565489268
但是发现效果并不好。下面待插值数据记为原始数据,想要的插值后的数据记为目标数据。
原始数据:
Python二维插值(scipy.interpolate.interp2d)注意输入参数维度问题_第1张图片
可以看到空间过度比较平滑。然后我采用了二维线性插值,这里以https://zhuanlan.zhihu.com/p/565489268给出的代码为例(图和代码不匹配,但是原理一样):

from scipy.interpolate import interp2d
import numpy as np
import matplotlib.pyplot as plt
#x,y数据为1维
x=np.arange(1,11)
y=np.arange(1,11)
#X,Y为二维
X,Y = np.meshgrid(x,y)
#R或者Z可以类比为原始影像经纬度,x,y类比为图像行列坐标
R = np.sqrt(X**2 +Y**2)
Z = np.sin(R)
#X1,Y1类别为目标影像行列坐标,需要根据此坐标插值获得目标影像的经纬度
x1 = np.arange(1,10.2,0.2)
y1 = np.arange(1,10.2,0.2)
X1,Y1 = np.meshgrid(x1,y1)
# 原文方法interp2d输入的是二维的坐标数据,kind='linear'
f1 = interp2d(X,Y,Z,kind='linear')
Z1 = f1(x1,y1)	#注意这里也是一维的

依照上述代码,插值结果如下
Python二维插值(scipy.interpolate.interp2d)注意输入参数维度问题_第2张图片
粗看没有什么我呢提,但是细看会发现右边有类似条形噪声的现象,具体原理上的问题并不清楚,欢迎大佬指点,这里只说现象。这导致后面的重投影的时候,像元的空间顺序是乱的。

解决方法

然后参考了scipy的原始文档(https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.interp2d.html#scipy.interpolate.interp2d),发现f1 = interp2d(X,Y,Z,kind=‘linear’)这里输入的数据维度应该是一维的,也就是x,y,而不是X,Y。

from scipy import interpolate
x = np.arange(-5.01, 5.01, 0.25)
y = np.arange(-5.01, 5.01, 0.25)
xx, yy = np.meshgrid(x, y)
z = np.sin(xx**2+yy**2)
f = interpolate.interp2d(x, y, z, kind='cubic')	#这里是一维的输入

进行上述修改后获得了满意的结果。
Python二维插值(scipy.interpolate.interp2d)注意输入参数维度问题_第3张图片

你可能感兴趣的:(##,Python遥感数据处理,python,scipy,numpy)