2017-04-18 6 views
1

J'essaie de recadrer un tableau numérique [largeur x hauteur x couleur] en une dimension plus petite prédéfinie.Center recadre un tableau numpy

J'ai trouvé quelque chose qui devrait faire ce que je veux mais cela ne fonctionne que pour les tableaux [width x height]. Je ne sais pas comment le faire fonctionner pour un tableau numpy qui a une dimension supplémentaire pour la couleur.

crop center portion of a numpy image

Répondre

2

Avec numpy vous pouvez utiliser les index de gamme. Dites que vous avez une liste x[] (dimension unique), vous pouvez l'indexer comme x[start:end] c'est ce qu'on appelle une tranche.

tranches peuvent être utilisés avec des dimensions supérieures aussi comme

x[start1:end1][start2:end2][start3:end3] 

Cela pourrait être ce que vous recherchez. Bien que rappelez-vous ceci ne génère pas un nouveau tableau (c.-à-d. Qu'il ne copie pas)

Les changements à cela se refléteront dans x.

1

de la question que vous avez lié à, il est juste un petit changement dans le code:

def crop_center(img,cropx,cropy): 
    y,x,c = img.shape 
    startx = x//2 - cropx//2 
    starty = y//2 - cropy//2  
    return img[starty:starty+cropy, startx:startx+cropx, :] 

Tout ce qui a été ajouté était un autre : à la fin de la dernière ligne, et un (inutilisé) c au forme déballage.

>>> img 
array([[[ 18, 1, 17], 
     [ 1, 13, 3], 
     [ 2, 17, 2], 
     [ 5, 9, 3], 
     [ 0, 6, 0]], 

     [[ 1, 4, 11], 
     [ 7, 9, 24], 
     [ 5, 1, 5], 
     [ 7, 3, 0], 
     [116, 1, 55]], 

     [[ 1, 4, 0], 
     [ 1, 1, 3], 
     [ 2, 11, 4], 
     [ 20, 3, 33], 
     [ 2, 7, 10]], 

     [[ 3, 3, 6], 
     [ 47, 5, 3], 
     [ 4, 0, 10], 
     [ 2, 1, 35], 
     [ 6, 0, 1]], 

     [[ 2, 9, 0], 
     [ 17, 13, 4], 
     [ 3, 0, 1], 
     [ 16, 1, 3], 
     [ 19, 4, 0]], 

     [[ 8, 19, 3], 
     [ 9, 16, 7], 
     [ 0, 12, 2], 
     [ 4, 68, 10], 
     [ 4, 11, 1]], 

     [[ 0, 1, 14], 
     [ 0, 0, 4], 
     [ 13, 1, 4], 
     [ 11, 17, 5], 
     [ 7, 0, 0]]]) 
>>> crop_center(img,3,3) 
array([[[ 1, 1, 3], 
     [ 2, 11, 4], 
     [20, 3, 33]], 

     [[47, 5, 3], 
     [ 4, 0, 10], 
     [ 2, 1, 35]], 

     [[17, 13, 4], 
     [ 3, 0, 1], 
     [16, 1, 3]]]) 
0

numpy fonctionne pour toutes les dimensions

import numpy as np 
X = np.random.normal(0.1, 1., [10,10,10]) 
X1 = X[2:5, 2:5, 2:5] 
print(X1.shape) 

derniers états d'impression résultats dans un tableau [3,3,3].