缩小时插值

时间:2014-11-10 14:59:13

标签: python numpy scipy zoom interpolation

我有一个2D数组,我想将其下采样以将其与另一个进行比较。

让我们说我的数组x512x512,我想要一个数组y 128x128,其中y的元素是使用插值生成的价值超过4x4的{​​{1}}块(此插值可能只取平均值,但其他方法,如几何平均值,可能会很有趣)

到目前为止,我看了x,但我没有得到我想要的结果

scipy.ndimage.interpolation.zoom

我希望>> x = np.arange(16).reshape(4,4) >> print(x) [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11] [12 13 14 15]] >> y = scipy.ndimage.interpolation.zoom(x, 0.5) >> print(y) [[ 0 3] [12 15]]

y

请注意,仅设置[[ 2.5 4.5] [10.5 12.5]] 并不能解决问题......

2 个答案:

答案 0 :(得分:1)

sklearn.feature_extraction.image.extract_patches巧妙地使用np.lib.stride_tricks.as_strided来制作可以操作的窗口数组。

sliding_window功能,可在此处找到 Efficient Overlapping Windows with Numpy生成一个带或不带重叠的窗口数组 还有,让我们一睹幕后发生的事情。

>>> a = np.arange(16).reshape(4,4)

step_height,step_width确定窗口的重叠 - 在您的情况下,步骤与窗口大小相同,没有重叠。

>>> window_height, window_width, step_height, step_width = 2, 2, 2, 2
>>> y = sliding_window(a, (window_height, window_width), (step_height,step_width))
>>> y
array([[[ 0,  1],
        [ 4,  5]],

       [[ 2,  3],
        [ 6,  7]],

       [[ 8,  9],
        [12, 13]],

       [[10, 11],
        [14, 15]]])

在Windows上操作:

>>> y = y.mean(axis = (1,2))
>>> y
array([  2.5,   4.5,  10.5,  12.5])

您需要根据窗口数确定最终形状。

>>> final_shape = (2,2)
>>> y = y.reshape(final_shape)
>>> y
array([[  2.5,   4.5],
       [ 10.5,  12.5]])

搜索SO numpy,窗口,数组应该产生许多其他答案和可能的解决方案。

答案 1 :(得分:0)

你似乎要寻找的是4块的平均值,zoom无法获得,因为zoom使用插值(参见其文档字符串)

要获得您展示的内容,请尝试以下

import numpy as np
x = np.arange(16).reshape(4, 4)

xx = x.reshape(len(x) // 2, 2, x.shape[1] // 2, 2).transpose(0, 2, 1, 3).reshape(len(x) // 2, x.shape[1] // 2, -1).mean(-1)

print xx

这会产生

[[  2.5   4.5]
 [ 10.5  12.5]]

或者,可以使用sklearn.feature_extraction.image.extract_patches

完成此操作
from sklearn.feature_extraction.image import extract_patches

patches = extract_patches(x, patch_shape=(2, 2), extraction_step=(2, 2))

xx = patches.mean(-1).mean(-1)

print xx

但是,如果你的目标是以优雅的方式对图像进行二次采样,那么采用图像的均值 是正确的方法:它可能会导致锯齿效果。在这种情况下,您应该做的是使用scipy.ndimage.gaussian_filter(例如sigma=0.35 * subsample_factor)稍微平滑图像,然后通过索引[::2, ::2]

进行子采样