2016-05-01 15 views
6

Ho 1000 immagini RGB (64X64) che voglio convertire in un array (m, n).Numpy flatten RGB image array

Io uso questo:

import numpy as np 
from skdata.mnist.views import OfficialImageClassification 
from matplotlib import pyplot as plt 
from PIL import Image                
import glob 
import cv2 

x_data = np.array([np.array(cv2.imread(imagePath[i])) for i in range(len(imagePath))]) 
print x_data.shape 

che mi dà: (1000, 64, 64, 3)

Ora, se faccio:

pixels = x_data.flatten() 
print pixels.shape 

ottengo: (12288000,)

Tuttavia, ho bisogno di un allineamento con queste dimensioni: (1000, 12288)

Come posso ottenere quello?

risposta

3

applicare il metodo NumPy reshape() dopo l'applicazione flatten() alla matrice appiattita:

x_data = np.array([np.array(cv2.imread(imagePath[i])) for i in range(len(imagePath))]) 

    pixels = x_data.flatten().reshape(1000, 12288) 
    print pixels.shape 
+0

Neat! Ciò preserverà le proprietà dell'immagine originale, ad esempio, non perderò alcuna informazione sui pixel? –

+2

'Flatten()' e 'reshape()' sono senza perdita di dati. Le dimensioni della matrice risultante devono sempre moltiplicarsi per essere lo stesso totale. Flatten ha un 'shape()' come array 1-D, non un array n-D, quindi nessun secondo valore per la sua forma. Sembra 'array ([1, 2, 3,])'. Una matrice n-D con forma (3,1) assomiglierebbe a 'array ([[1], [2], [3]])'. – Ray

+1

Ecco un ottimo post SO su shaping: http://stackoverflow.com/questions/22053050/difference-between-numpy-array-shape-r-1-and-r – Ray

4

Prova questo:

d1, d2, d3, d4 = x_data.shape 

utilizzando numpy.reshape()

x_data_reshaped = x_data.reshape((d1, d2*d3*4)) 
+1

'd2 * D3 * 4' è meglio scritte' -1'. Quindi 'x_data_reshaped = x_data.reshape (x_data.shape [0], -1)' – Eric

+0

@Eric Puoi spiegare come x_data.reshape ((d1, d2 * d3 * 4)) e x_data.reshape (x_data.shape [0 ], -1) sono gli stessi? –

2

È possibile iterare l'array immagini e appiattire ogni riga in modo indipendente.

numImages = x_data.shape[0] 
flattened = np.array([x_data[i].flatten() for i in range(0,numImages)])