web-dev-qa-db-fra.com

Afficher l'image en niveaux de gris avec matplotlib

J'essaie d'afficher une image en niveaux de gris avec 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 niveaux de gris parce que je veux dessiner en haut de l'image avec de la couleur.

Je lis dans l'image et convertis en niveaux de gris en utilisant Image.open (). Convert ("L") de PIL

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

Ensuite, je convertis l’image en matrice afin de pouvoir facilement traiter certaines images à l’aide de

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 que ce n'est pas en niveaux de gris).

Qu'est-ce que je fais mal ici?

202
Ryan

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 souhaitez afficher les niveaux de gris inversés, réglez la cmap sur cmap='gray_r'.

312
unutbu

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

Par exemple. quelque chose comme

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

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

26
janneb

import matplotlib.pyplot as plt

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

plt.gray()

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

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

Je voudrais utiliser la méthode get_cmap. Ex.:

import matplotlib.pyplot as plt

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

essaye ça:

import pylab
from scipy import misc

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

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

Par défaut, plt.imshow () essaiera de redimensionner vos données de tableau (MxN) entre 0.0 et 1.0. Et ensuite mapper à 0 ~ 255. Pour la plupart des images naturelles, c'est très bien, vous n'en verrez pas d'autre. Mais si vous avez une plage étroite d’images de valeur en pixels, supposons que le pixel minimum soit 156 et le pixel maximum 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 originale: original

ceci utilise le réglage de la norme defaul, qui est None: mauvaise image

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

7
Stanley

N'utilisez pas d'interpolation et paramétrez sur gris.

import matplotlib.pyplot as plt
plt.imshow(img[:,:,1], cmap='gray',interpolation='none')
2
user3452134