273 votes

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

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 des niveaux de gris car je veux dessiner en couleur sur l'image.

Je lis l'image et je la convertis en niveaux de gris en utilisant LIP's Image.open().convert("L")

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

Ensuite, je convertis l'image en une matrice afin de pouvoir facilement effectuer 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 en utilisant une carte de couleurs (c'est-à-dire que ce n'est pas une échelle de gris).

Qu'est-ce que je fais de mal ici ?

433voto

unutbu Points 222216

Le code suivant chargera une image à partir d'un fichier image.png et 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 voulez afficher l'échelle de gris inverse, passez le cmap à cmap='gray_r' .

4 votes

@jay : Per ce doc string , "Notez que toute carte de couleurs listée ici peut être inversée en ajoutant _r ."

36 votes

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

0 votes

Vous n'avez pas besoin de convertir l'image en canal unique. convert("L") si la seule chose dont vous avez besoin est de montrer l'image en gris cmap="gray" est ce dont vous avez besoin dans imshow . J'ai un exemple similaire dans OpenCV pour image à canal unique mais vous pouvez ouvrir n'importe quelle image RGB et l'afficher avec cmap='gray' .

34voto

janneb Points 17303

Essayez d'utiliser une carte de couleurs en niveaux de gris ?

Par exemple, quelque chose comme

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

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

20voto

import matplotlib.pyplot as plt

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

plt.gray()

Par défaut, les images seront affichées en niveaux de gris.

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

0 votes

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

0 votes

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

13voto

Al Conrad Points 1

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

import matplotlib.pyplot as plt

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

13voto

Stanley Points 461

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

Par défaut, plt.imshow() essaiera de mettre à l'échelle vos données de tableau (MxN) à 0.0~1.0. Et ensuite de mapper à 0~255. Pour la plupart des images prises naturellement, c'est très bien, vous ne verrez pas de différence. Mais si vous avez une gamme étroite de valeurs de pixels, disons que le pixel minimum est 156 et le pixel maximum est 234. L'image grise aura l'air totalement fausse. La bonne façon d'afficher une image en gris est la suivante

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

Voyons un exemple :

C'est l'image originale : 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

0 votes

Dans Colab, j'obtiens une erreur lorsque j'utilise NoNorm Cependant norm=None travaux

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X