Afficher l'image en niveaux de gris à l'aide de matplotlib


232

J'essaie d'afficher une image en niveaux de gris à l'aide de matplotlib.pyplot.imshow () . Mon problème est que l'image en niveaux de gris est affichée sous forme de palette de couleurs. J'ai besoin de l'échelle de gris car je veux dessiner sur l'image avec de la couleur.

J'ai lu l'image et je l'ai convertie en niveaux de gris en utilisant Image.open () de PIL. Convert ("L")

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

Ensuite, je convertis l'image en une matrice afin que je puisse facilement faire un traitement d'image en utilisant

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

Cependant, quand je fais

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

il affiche l'image à l'aide d'une palette de couleurs (c'est-à-dire qu'elle n'est pas en niveaux de gris).

Qu'est-ce que je fais mal ici?

Réponses:


369

Le code suivant chargera une image à partir d'un fichier image.pnget l'affichera 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', vmin=0, vmax=255)
plt.show()

Si vous souhaitez afficher l'échelle de gris inverse, basculez la cmap sur cmap='gray_r'.


4
@jay: Selon cette chaîne de documentation , "Notez que toute palette de couleurs répertoriée ici peut être inversée en ajoutant _r."
unutbu

31
Avertissement matplotlib ajuste l'intensité de l'échelle des pixels si vous ne souhaitez pas l'utiliser:plt.imshow(im_gray,cmap='gray', vmin = 0, vmax = 255)
themadmax


17

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()

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

@SherylHohman, c'est gray... le gris est l'orthographe américaine standard et le gris est l'orthographe britannique pour la même couleur.
Cloud Cho

12

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

import matplotlib.pyplot as plt

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

11

La réponse de @ unutbu est assez proche de la bonne réponse.

Par défaut, plt.imshow () tentera de mettre à l'échelle vos données de tableau (MxN) à 0,0 ~ 1,0. Et puis mappez à 0 ~ 255. Pour la plupart des images prises naturellement, c'est bien, vous ne verrez pas de différence. Mais si vous avez une plage étroite d'images de valeur de pixel, disons que le pixel minimum est 156 et le pixel maximum est 234. L'image grise sera totalement fausse. 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:

c'est l'image d' origine : original

ceci utilise le paramètre de norme par défaut, qui est Aucun: mauvaise image

ceci utilise le paramètre NoNorm, qui est NoNorm (): image de droite


9

essaye ça:

import pylab
from scipy import misc

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

il n'y a pas pylab.grey(), peut-être qu'il a été supprimé?
Lyndon White

4

N'utilisez aucune interpolation et définissez le gris.

import matplotlib.pyplot as plt
plt.imshow(img[:,:,1], cmap='gray',interpolation='none')
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.