在NumPy数组上进行上采样和插值

7

我有一个数组,类似于:

array = np.arange(0,4,1).reshape(2,2)

> [[0 1
    2 3]]

我希望对这个数组进行上采样并插值。我知道一种好的方法是使用:

array = eratemp[0].repeat(2, axis = 0).repeat(2, axis = 1)
[[0 0 1 1]
 [0 0 1 1]
 [2 2 3 3]
 [2 2 3 3]]

但我无法想出一种方法来插值,以消除数组中每个2x2部分之间的“块状”特性。

我想要这样的结果:

[[0 0.4 1 1.1]
 [1 0.8 1 2.1]
 [2 2.3 3 3.1]
 [2.1 2.3 3.1 3.2]]

像这样的内容(注意:这些不是确切的数字)。我知道可能无法插值这个特定的2D网格,但使用我回答中的第一个网格,在上采样过程中应该可以进行插值,因为您正在增加像素数量,从而可以“填补空白”。
我并不太在意插值的类型,只要最终输出是平滑的表面!我尝试使用scipy.interp2d方法,但没有成功,如果有人能分享他们的智慧,我会非常感激!

你想进行二维插值吗?我不知道这会怎么工作。一旦你插值一个轴,你就会破坏另一个轴的插值。对吧? - tnknepp
“你明白我的意思了吗!”——抱歉,我还不太明白。你能填写你期望的4x4数组的其余部分吗? - Ahmed Fasih
感谢您的评论。我已经填写了网格的其余部分,以便给出我期望的结果的一些想法。我知道在我的答案中插值第二个2D网格可能会有问题,但在上采样过程发生时,必须有一种方法来插值第一个网格,对吧? - tda
3个回答

8
你可以使用SciPy的interp2d进行插值,你可以在这里找到文档。
我稍微修改了文档中的示例:
from scipy import interpolate
x = np.array(range(2))
y = np.array(range(2))
a = np.array([[0, 1], [2, 3]])
f = interpolate.interp2d(x, y, a, kind='linear')

xnew = np.linspace(0, 2, 4)
ynew = np.linspace(0, 2, 4)
znew = f(xnew, ynew)

如果你打印znew,它应该长这样:
array([[ 0.        ,  0.66666667,  1.        ,  1.        ],
       [ 1.33333333,  2.        ,  2.33333333,  2.33333333],
       [ 2.        ,  2.66666667,  3.        ,  3.        ],
       [ 2.        ,  2.66666667,  3.        ,  3.        ]])

+1 谢谢!很好地利用了现有的函数,一次性完成了我的上采样和插值步骤! - tda

2

我会使用scipy.misc.imresize函数:

array = np.arange(0,4,1).reshape(2,2)
from skimage.transform import resize
out = scipy.misc.imresize(array, 2.0)
2.0 表示我想要输出的尺寸是输入的两倍。您还可以提供一个 int 或一个 tuple 来指定原始尺寸的百分比或新的尺寸本身。
这非常容易使用,但有一个额外的步骤,因为 imresize 重新缩放所有内容,使您的最大值变为 255,最小值变为 0。(并将数据类型更改为 np.unit8)。您可能需要执行以下操作:
out = out.astype(array.dtype) / 255 * (np.max(array) - np.min(array)) + np.min(array)

让我们来看一下输出结果:
>>> out.round(2)
array([[0.  , 0.25, 0.75, 1.  ],
       [0.51, 0.75, 1.26, 1.51],
       [1.51, 1.75, 2.26, 2.51],
       [2.  , 2.25, 2.75, 3.  ]])

imresize 带有弃用警告和替代品:

DeprecationWarning: imresize 已被弃用!imresize 在SciPy 1.0.0中已经弃用,并将在1.2.0中删除。请使用 skimage.transform.resize 替代。


0

在SciPy中的Form resample方法中,信号处理可以顺序地在一个轴上上采样你的2D数组,然后在另一个轴上进行。


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接