2015-01-17 11 views
5

Sto cercando di visualizzare un'immagine RGB 32x32 pixel in formato CIFAR-10. È una matrice NumPy cui valori di pixel (uint8) sono disposti come segue: "I primi 1024 byte sono i valori dei canali rosso, il prossimi 1024 verde, e la finale 1024 blu I valori vengono memorizzati in ordine row-major,. quindi i primi 32 byte sono i valori del canale rosso della prima riga dell'immagine. "come visualizzare un'immagine RGB con pylab

Così, la forma immagine originale è:

numpy.shape(image) 
(3072L,) 

ho rimodellare in questo modo:

im = numpy.reshape(image, (32,32,3)) 

Tuttavia, quando provo

imshow(im) 

in consolle ipython, vedo 3 per 3 tessere dell'immagine originale: enter image description here

Mi aspettavo di vedere invece una singola immagine di una macchina. Ho visto this question qui, ma non sono sicuro di quello che stanno facendo lì, e se è rilevante per la mia situazione.

risposta

8

Provare a modificare l'ordine. Per impostazione predefinita, è C-contiguo (che di fatto è row-major), ma per matplotlib, è necessario i valori del canale rosso in [:,:,0]. Ciò significa che devi leggere i dati in ordine Fortran in modo che riempia prima le "colonne" (in questo contesto 3D).

im = numpy.reshape(c, (32,32,3), order='F') 
12

So che è stato un po 'dal momento che la domanda è stata pubblicata ma voglio correggere la risposta di Oliver. Se ordini da Fortran, l'immagine viene invertita e ruotata di 90 gradi in senso antiorario.

è ancora possibile allenarsi su questi dati, naturalmente, se si formatta tutte le immagini in questo modo. Ma per evitare di impazzire, si dovrebbe effettuare le seguenti operazioni:

im = c.reshape(3,32,32).transpose(1,2,0) 

Quello che state facendo è prima rimodellando la matrice utilizzando il formato di default che si ottiene RGB nella prima dimensione e poi righe e colonne in un altro due dimensioni. Quindi mischia le dimensioni in modo che la prima dimensione nell'originale (RGB, indicizzato a 0) venga spostata nella terza dimensione e la seconda e la terza siano spostate di 1.

Spero che questo sia stato d'aiuto.

+0

Grazie. Per tracciare l'immagine 'im' in OpenCV devi scambiare la colonna R e B. 'cv2.imshow (" immagine ", cv2.resize (cv2.cvtColor (im, cv2.COLOR_BGR2RGB), (512,512), interpolazione = cv2.INTER_AREA))' – Ruut