1

如何调整 Nd numpy 图像的大小?

我不只是想对它进行二次采样,而是对像素进行插值/平均。

例如,如果我从

array([[[3, 1, 3, 1],
        [3, 1, 3, 1],
        [3, 1, 3, 1],
        [3, 1, 3, 1]],

       [[3, 1, 3, 1],
        [3, 1, 3, 1],
        [3, 1, 3, 1],
        [3, 1, 3, 1]]], dtype=uint8)

并在所有维度上将其缩小 2 倍,我希望输出为

array([[[2, 2],
        [2, 2]]], dtype=uint8)

尝试的解决方案:

A. SciPy ndimage:

>>> scipy.ndimage.interpolation.zoom(x, .5, mode='nearest')

array([[[3, 1],
        [3, 1]]], dtype=uint8)

(可选order参数没有区别)

B. 循环2**3可能的偏移量:丑陋,缓慢,仅适用于整数缩放因子,并且需要额外的步骤以避免溢出。

C. OpenCV 和 PIL 仅适用于 2D 图像。

4

1 回答 1

1

重塑以将每个轴拆分为每个长度的另一个轴2,给我们一个6D数组,然后沿着后面的那些轴(轴:)获得平均值1,3,5-

m,n,r = a.shape
out = a.reshape(m//2,2,n//2,2,r//2,2).mean((1,3,5))

扩展到n-dim数组,它将是 -

def shrink(a, S=2): # S : shrink factor
    new_shp = np.vstack((np.array(a.shape)//S,[S]*a.ndim)).ravel('F')
    return a.reshape(new_shp).mean(tuple(1+2*np.arange(a.ndim)))

样品运行 -

In [407]: a
Out[407]: 
array([[[1, 5, 8, 2],
        [5, 6, 4, 0],
        [8, 5, 5, 5],
        [1, 0, 0, 0]],

       [[0, 0, 7, 6],
        [3, 5, 4, 3],
        [4, 5, 1, 3],
        [6, 7, 4, 0]]])

In [408]: a[:2,:2,:2].mean()
Out[408]: 3.125

In [409]: a[:2,:2,2:4].mean()
Out[409]: 4.25

In [410]: a[:2,2:4,:2].mean()
Out[410]: 4.5

In [411]: a[:2,2:4,2:4].mean()
Out[411]: 2.25

In [412]: shrink(a, S=2)
Out[412]: 
array([[[ 3.125,  4.25 ],
        [ 4.5  ,  2.25 ]]])
于 2017-10-19T09:32:21.953 回答