两个矩阵之间的插值

时间:2013-09-06 09:32:14

标签: python matrix interpolation

我有两个矩阵代表网格上不同时间的数量值。 我想在中间时间创建第三个矩阵,其像素在两个矩阵之间进行插值。

我尝试对每个像素进行简单的线性插值,但是如果我使用imshow可视化最终产品,那么帧之间并没有平滑过渡。

我无法提供一个直接的例子,因为我正在处理一个庞大的数据集,但我想知道是否有人遇到过类似的问题。

我知道scipy.interpolate函数,但它们似乎只是为了插入一组离散点而派上用场。

2 个答案:

答案 0 :(得分:4)

由于原始数据已经网格化,您可以使用ndimage.map_coordinates进行插值:

import numpy as np
import scipy.ndimage as ndimage
import matplotlib.pyplot as plt

# given 2 arrays arr1, arr2
arr1 = np.linspace(0, 1, 100).reshape(10,10)
arr2 = np.linspace(1, 0, 100).reshape(10,10)

# rejoin arr1, arr2 into a single array of shape (2, 10, 10)
arr = np.r_['0,3', arr1, arr2]

# define the grid coordinates where you want to interpolate
X, Y = np.meshgrid(np.arange(10), np.arange(10))
# 0.5 corresponds to half way between arr1 and arr2
coordinates = np.ones((10,10))*0.5, X, Y

# given arr interpolate at coordinates
newarr = ndimage.map_coordinates(arr, coordinates, order=2).T
fig, ax = plt.subplots(ncols=3)
cmap = plt.get_cmap('Greys')

vmin = np.min([arr1.min(), newarr.min(), arr2.min()])
vmax = np.max([arr1.max(), newarr.max(), arr2.max()])
ax[0].imshow(arr1, interpolation='nearest', cmap=cmap, vmin=vmin, vmax=vmax)
ax[1].imshow(newarr, interpolation='nearest', cmap=cmap, vmin=vmin, vmax=vmax)
ax[2].imshow(arr2, interpolation='nearest', cmap=cmap, vmin=vmin, vmax=vmax)
ax[0].set_xlabel('arr1')
ax[1].set_xlabel('interpolated')
ax[2].set_xlabel('arr2')
plt.show()

enter image description here

答案 1 :(得分:2)

假设矩阵是numpy数组,并且因为你只有两个点,你可以自己简单地实现(线性)插值:

def interp(m1, t1, m2, t2, t_interp):
    return m1 + (m2-m1) / (t2-t1) * (t_interp-t1)

其中m1 / m2可以任意形成numpy数组,t1 / t2可以是相应的时间值。 t_interp将是插值的时间值。 因此,这为m1提供了t_interp = t1,为m2提供了t_interp = t2