2017-10-04 2 views
1

Je travaille avec une liste d'images image_list. Chaque élément dans image_list est un tableau numpy avec la forme (X, Y, 3). X est la hauteur, Y est la largeur, et chaque image a 3 canaux de couleurs. Je veux obtenir la largeur maximale et la hauteur de toutes les images, et redimensionner chaque image de sorte que le fond et le droit est rempli de 0 s'il y a de l'espace supplémentaire. Je peux faire la première partie (obtention de la hauteur maximale et de la largeur maximum) mais je me bats avec la seconde (redimensionnement et remplissage de la zone excédentaire à droite et en bas avec des zéros).Agrandir l'image numpy et remplir l'espace supplémentaire avec des zéros

max_height = 0 
max_width = 0 
for image in image_list: 
    shape = image.shape 
    if shape[0] > max_height: 
     max_height = shape[0] 
    if shape[1] > max_width: 
     max_width = shape[1] 

Pour redimensionner, j'ai essayé:

image.resize((max_height, max_width, 3)) 

Mais cela ne fonctionne parfois. D'autres fois, vous obtenez la même image répétée plusieurs fois.

Répondre

1

Approche # 1

Voici une approche avec A étant la liste d'entrée des images -

M,N = np.max([i.shape[:2] for i in A],0) 
M_ext = [M-i.shape[0] for i in A] 
N_ext = [N-i.shape[1] for i in A] 
out = [img3D_pad(a,M_ext[i],N_ext[i]) for i,a in enumerate(A)] 

fonction d'aide -

def img3D_pad(a,m,n): 
    return np.pad(a,((0,m),(0,n),(0,0)),'constant') 

Vérification

1) Vérification Forme:

In [108]: A = [np.random.randint(11,99,(4,5,3)), np.random.randint(11,99,(2,6,3))] 

In [109]: [i.shape for i in out] 
Out[109]: [(4, 6, 3), (4, 6, 3)] 

2) Vérification de la valeur:

In [110]: A[0][...,0] 
Out[110]: 
array([[53, 64, 41, 13, 85], 
     [74, 53, 88, 47, 54], 
     [35, 26, 93, 68, 80], 
     [38, 68, 50, 83, 77]]) 

In [111]: out[0][...,0] 
Out[111]: 
array([[79, 33, 41, 16, 76, 0], 
     [11, 49, 54, 56, 40, 0], 
     [38, 43, 98, 95, 23, 0], 
     [26, 26, 20, 59, 53, 0]]) 

In [112]: A[1][...,0] 
Out[112]: 
array([[76, 44, 29, 20, 91, 71], 
     [71, 90, 11, 51, 81, 22]]) 

In [113]: out[1][...,0] 
Out[113]: 
array([[57, 11, 42, 95, 87, 75], 
     [15, 70, 88, 88, 41, 95], 
     [ 0, 0, 0, 0, 0, 0], 
     [ 0, 0, 0, 0, 0, 0]]) 

Approche # 2

un simplifié basé sur zeros-initialization -

M,N = np.max([i.shape[:2] for i in A],0) 
out = [img3D_create(a,M,N) for i,a in enumerate(A)] 

Fonction auxiliaire -

def img3D_create(a,M,N): 
    p,q,r = a.shape 
    out = np.zeros((M,N,r),dtype=a.dtype) 
    out[:p,:q] = a 
    return out