【问题标题】:Interpolation of values when zooming down缩小时的插值
【发布时间】:2015-01-06 22:06:26
【问题描述】:

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

假设我的数组x512x512,我想要一个数组y 128x128,其中y 的元素是使用4x4 块@987654327 的值的插值构建的@(这种插值可能只是取平均值,但其他方法,如几何平均,可能会很有趣)

到目前为止,我查看了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]]

请注意,简单地设置 dtype=np.float32 并不能解决这个问题...

【问题讨论】:

    标签: python numpy scipy zooming interpolation


    【解决方案1】:

    sklearn.feature_extraction.image.extract_patches 巧妙地使用np.lib.stride_tricks.as_strided 生成一个可以操作的windowed 数组。

    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]]])
    

    在窗户上操作:

    >>> 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、窗口、数组应该会产生许多其他答案和可能的解决方案。

    【讨论】:

      【解决方案2】:

      您似乎正在寻找的是 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]进行子采样

      【讨论】:

      • 我希望这个操作可以比较不同采样级别的科学数据......不要以传统方式处理图像因此我不知道应用高斯滤波器是否是一件好事或不是我的情况。我会记住的
      • 那么所有的抽样规则仍然适用吗?混叠不是图像特定的,但可能发生在您尝试使用离散测量近似的任何连续信号上。平均相邻值对应于乘以傅立叶空间中的sinc 类型函数,该函数具有无限支持并且不会很好地减少,而高斯平滑尽管有无限支持,但至少正在迅速减少。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多