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?

Ryan
la source

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'.

unutbu
la source
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()
Eliel Van Hojman
la source
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'))
Al Conrad
la source
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

Stanley
la source
9

essaye ça:

import pylab
from scipy import misc

pylab.imshow(misc.lena(),cmap=pylab.gray())
pylab.show()
baco
la source
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')
user3452134
la source