2010-09-29 29 views
137

J'essaie d'afficher une image en niveaux de gris en utilisant matplotlib.pyplot.imshow(). Mon problème est que l'image en niveaux de gris est affichée comme une carte de couleurs. J'ai besoin de l'échelle de gris parce que je veux dessiner sur le dessus de l'image avec la couleur.Afficher l'image en niveaux de gris en utilisant matplotlib

Je lis dans l'image et les convertir en niveaux de gris en utilisant Image.open de PIL(). Convertir (« L »)

image = Image.open(file).convert("L")

Puis-je convertir l'image à une matrice afin que je puisse le faire facilement un certain traitement de l'image en utilisant

matrix = scipy.misc.fromimage(image, 0)

Cependant, quand je fais

figure() 
matplotlib.pyplot.imshow(matrix) 
show()

il affiche l'image en utilisant une carte de couleurs (c.-à-d. ce n'est pas en niveaux de gris).

Qu'est-ce que je fais mal ici? Essayez d'utiliser une palette de couleurs en niveaux de gris?

Répondre

213

Le code suivant charge une image à partir d'un fichier image.png et l'afficher en niveaux de gris.

import numpy as np 
import matplotlib.pyplot as plt 
from PIL import Image 

fname = 'image.png' 
image = Image.open(fname).convert("L") 
arr = np.asarray(image) 
plt.imshow(arr, cmap='gray') 
plt.show() 

Si vous souhaitez afficher le niveau de gris inverse, mettez le CMAP à cmap='gray_r'.

+3

@jay: Par [cette chaîne doc] (http: // matplotlib.org/examples/color/colormaps_reference.html), "Notez que n'importe quelle palette de couleurs répertoriée ici peut être inversée en ajoutant' _r'. " – unutbu

+13

Attention matplotlib ajuster l'intensité de l'échelle des pixels si vous ne voulez pas utiliser: 'plt.imshow (im_gray, cmap = 'gris', vmin = 0, vmax = 255)' – themadmax

19

Par ex quelque chose comme

imshow(..., cmap=pyplot.cm.binary) 

Pour une liste des colormaps, voir http://scipy-cookbook.readthedocs.org/items/Matplotlib_Show_colormaps.html

+1

Le lien ne fonctionne plus, était-il similaire à celui-ci? http://scipy-cookbook.readthedocs.org/items/Matplotlib_Show_colormaps.html – Mark

+0

@Mark: Oui, cela semble être la nouvelle URL, mis à jour ma réponse. Pour l'ancienne version, voir https://web.archive.org/web/20101121120543/http://www.scipy.org/Cookbook/Matplotlib/Show_colormaps – janneb

7

essayez ceci:

import pylab 
from scipy import misc 

pylab.imshow(misc.lena(),cmap=pylab.gray()) 
pylab.show() 
+0

il n'y a pas de 'pylab.grey()', peut-être il a été enlevé? –

+9

Wow ... Lena est inclus dans scipy ... – wlnirvana

+1

non, pas dans 0.18.0 plus – IljaBek

10

import matplotlib.pyplot as plt

Vous pouvez également exécuter une fois dans votre code

plt.gray() 

Cela montrera les images en niveaux de gris par défaut

im = array(Image.open('I_am_batman.jpg').convert('L')) 
plt.imshow(im) 
plt.show() 
+2

cela fonctionne, mais l'appel est 'gris()', n'est ce pas? –

+0

Quelle bibliothèque utilisez-vous pour 'gray()' ou 'gray()'? – SherylHohman

7

J'utiliserais la méthode get_cmap. Ex .:

import matplotlib.pyplot as plt 

plt.imshow(matrix, cmap=plt.get_cmap('gray')) 
+0

Cela semble simple et fonctionne parfaitement. – arsho

0

La réponse de @ unutbu est assez proche de la bonne réponse. Par défaut, plt.imshow() essayera de mettre à l'échelle vos données de tableau (MxN) à 0.0 ~ 1.0. Et puis mapper à 0 ~ 255. Pour la plupart des images prises naturelles, c'est bien, vous ne verrez pas un autre. Mais si vous avez une plage étroite d'image de valeur de pixel, disons que le pixel min est 156 et le pixel maximum est 234. L'image grise semblera totalement erronée. La bonne façon de montrer une image en gris est

from matplotlib.colors import NoNorm 
... 
plt.imshow(img,cmap='gray',norm=NoNorm()) 
... 

Voyons un exemple:

ceci est l'image origianl: original

ce utilise l'établissement de normes defaul, qui est None: wrong pic

cela est d'utiliser réglage de NoNorm, qui est NoNorm(): right pic