2010-04-17 10 views
109

J'ai créé un tableau thusly:Comment convertir un tableau numérique en (et afficher) une image?

import numpy as np 
data = np.zeros((512,512,3), dtype=np.uint8) 
data[256,256] = [255,0,0] 

Ce que je veux que ce faire est d'afficher un seul point rouge au centre d'une image 512x512. (Au moins pour commencer ... Je pense que je peux comprendre le reste à partir de là)

+1

Voir aussi http://stackoverflow.com/questions/902761/saving-a-numpy-array-as- an-image bien que celle-ci ait imposé la contrainte que PIL ne puisse pas être utilisé. –

Répondre

96

Vous pouvez utiliser PIL pour créer (et l'affichage) une image:

from PIL import Image 
import numpy as np 

w, h = 512, 512 
data = np.zeros((h, w, 3), dtype=np.uint8) 
data[256, 256] = [255, 0, 0] 
img = Image.fromarray(data, 'RGB') 
img.save('my.png') 
img.show() 
+0

Cela fonctionne magnifiquement. Je vous remercie. – jlswint

+2

Il semble qu'il y ait un bug. Vous créez un tableau avec la taille '(w, h, 3)', mais il devrait être '(h, w, 3)', car l'indexation dans PIL diffère de l'indexation dans numpy. Il y a une question connexe: http: // stackoverflow.com/questions/33725237/image-fromarray-changes-size – user502144

+0

@ utilisateur502144: Merci d'avoir signalé mon erreur. J'aurais dû créer un tableau de forme '(h, w, 3)'. (Il est maintenant fixé, ci-dessus.) La longueur du premier axe peut être considérée comme le nombre de lignes dans le tableau, et la longueur du second axe, le nombre de colonnes. Donc '(h, w)' correspond'a un tableau de "hauteur" 'h' et' largeur ''w'. 'Image.fromarray' convertit ce tableau en une image de hauteur' h' et de largeur 'w'. – unutbu

0

En utilisant pygame, vous pouvez ouvrir une fenêtre, obtenir la surface sous forme de tableau de pixels et la manipuler comme vous le souhaitez. Cependant, vous devrez copier votre tableau numpy dans le tableau de surface, ce qui sera beaucoup plus lent que de faire des opérations graphiques réelles sur les surfaces de pygame elles-mêmes.

40

Shortest Path est d'utiliser scipy, comme ceci:

from scipy.misc import toimage 
toimage(data).show() 

Cela nécessite également d'installer PIL ou Oreiller.

Une approche similaire aussi exigeant PIL ou oreiller, mais qui peut invoquer un autre spectateur est:

from scipy.misc import imshow 
imshow(data) 
+0

Donc cette méthode est incompatible avec python 3.5 ...? – bordeo

+0

@bordeo, pourquoi serait-il incompatible avec 3.5? C'est juste une importation et un couple d'appels de fonction. –

+0

PIL est incompatible avec 3.5 (n'installera pas) – bordeo

145

-vous simplement dire cela?

from matplotlib import pyplot as plt 
plt.imshow(data, interpolation='nearest') 
plt.show() 
+2

Ceci est plus précis que PIL. PIL redimensionne/normalise les valeurs du tableau, alors que pyplot utilise les valeurs RVB réelles telles qu'elles sont. – GaryO

+2

Merci! mérite le badge de la meilleure réponse! –

+9

Peut-être bon à savoir: Si vous voulez afficher des images en niveaux de gris, il est conseillé d'appeler 'plt.gray()' une fois dans votre code pour passer tous les graphiques suivants en niveaux de gris. Pas ce que l'OP veut mais bon à savoir néanmoins. – Cerno

Questions connexes