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?
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'
.
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
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()
Je voudrais utiliser la méthode get_cmap. Ex.:
import matplotlib.pyplot as plt
plt.imshow(matrix, cmap=plt.get_cmap('gray'))
essaye ça:
import pylab
from scipy import misc
pylab.imshow(misc.lena(),cmap=pylab.gray())
pylab.show()
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
N'utilisez pas d'interpolation et paramétrez sur gris.
import matplotlib.pyplot as plt
plt.imshow(img[:,:,1], cmap='gray',interpolation='none')