2017-10-19 35 views
1

如何调整N-D numpy图像的大小?如何调整N-D 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图像。

回答

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