2017-10-19 9 views
1

Comment redimensionner une image N-d numpy?Comment redimensionner l'image N-d numpy?

Je ne veux pas seulement le sous-échantillonner, mais aussi interpoler/faire la moyenne des pixels.

Par exemple, si je commence par

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) 

et rétrécir par un facteur de 2 dans toutes les dimensions, je veux que la sortie soit

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

solutions tentées:

A. SciPy ndimage:

(Le paramètre order option ne fait aucune différence)

B. bouclez 2**3 décalages possibles: laid, lent, ne fonctionne que pour les facteurs de zoom entiers, et a besoin des mesures supplémentaires pour éviter les débordements. C. OpenCV et PIL fonctionnent uniquement avec des images 2D.

Répondre

1

Reshape à diviser chaque axe dans un axe de plus chacun de longueur 2, nous donnant un tableau 6D puis obtenir la moyenne le long de ces derniers les (axes: 1,3,5) -

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

Extension à un tableau n-dim, il serait -

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

run Exemple -

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