2011-10-13 29 views
6

He cargado una imagen RGB con PIL/OpenCV, y me gustaría convertir todos sus canales en un solo 1x (3 * width * height) secuencia en el fin de alimentar a un ANN. Encontré que puedo hacer simplemente:Flatten OpenCV/Numpy matriz

rlist = [] 
glist = [] 
blist = [] 
for i in xrange(im.width): 
    for j in xrange(im.height): 
     r,g,b = im[i,j] 
     rlist.append(r) 
     glist.append(g) 
     blist.append(b) 
img_vec = rlist + blist + glist 

Pero obviamente esto es terriblemente ineficiente. ¿Hay una manera más rápida con alguna rutina interna de OpenCV/numpy?

+0

tengo curiosidad. ¿Qué es una ANN? –

+0

ANN == red neuronal artificial – Cerin

Respuesta

7

Como un ejemplo rápido:

import Image 
import numpy as np 

im = Image.open('temp.png') 
data = np.array(im) 
flattened = data.flatten() 

print data.shape 
print flattened.shape 

Esto produce:

(612, 812, 4) 
(1987776,) 

Alternativamente, en lugar de llamar data.flatten(), se podría llamar data.reshape(-1). -1 se usa como marcador de posición para "averiguar cuál debe ser la dimensión dada".

Tenga en cuenta que esto producirá un vector (flattened) de r0, g0, b0, r1, g1, b1, ... rn, gn, bn, mientras que usted quiere un vector de r0, r1 ... rn, b0, b1, ... bn, g0, g1, ... gn.

para obtener exactamente lo que quiere, simplemente llame

flattened = data.T.flatten() 

lugar.

+0

¿Estás seguro de data.T.flatten()? Mis pruebas muestran que data.flatten() devuelve los datos en orden [r1, r2 ..., g1, g2, ... b1, b2 ...] mientras que data.T.flatten() los devuelve en orden [r1 , g1, b1, r2, g2, b2, ...]. Sin embargo, probé utilizando matrices numpy simples, no imágenes reales. – Cerin