2010-09-29 12 views
137

Sto tentando di visualizzare un'immagine in scala di grigio usando matplotlib.pyplot.imshow(). Il mio problema è che l'immagine in scala di grigi viene visualizzata come mappa colori. Ho bisogno della scala di grigi perché voglio disegnare sopra l'immagine con il colore.Visualizzare l'immagine come scala di grigi usando Matplotlib

ho letto nell'immagine e convertire in scala di grigio utilizzando del PIL Image.open(). Convertire ("L")

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

Poi convertire l'immagine in una matrice in modo che possa facilmente fare alcuni di elaborazione delle immagini utilizzando

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

Tuttavia, quando lo faccio

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

visualizza l'immagine usando una mappa di colori (ad es. non è in scala di grigi).

Cosa sto facendo di sbagliato qui?

risposta

213

Il codice seguente caricare un'immagine da un file image.png e mostrerà come scala di grigi.

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') 
plt.show() 

Se si desidera visualizzare la scala di grigi inversa, passare il CMAP a cmap='gray_r'.

+3

@jay: Per [questa stringa doc] (http: // matplotlib.org/examples/color/colormaps_reference.html), "Notare che qualsiasi colormap qui elencata può essere invertita aggiungendo' _r'. " – unutbu

+13

L'avviso matplotlib regola l'intensità della scala dei pixel se non si desidera utilizzare: 'plt.imshow (im_gray, cmap = 'gray', vmin = 0, vmax = 255)' – themadmax

19

Prova ad utilizzare una mappa dei colori in scala di grigi?

E.g. qualcosa come

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

Per un elenco di mappe di colori, vedi http://scipy-cookbook.readthedocs.org/items/Matplotlib_Show_colormaps.html

+1

Il link non funziona più, era simile a questo? http://scipy-cookbook.readthedocs.org/items/Matplotlib_Show_colormaps.html – Mark

+0

@Mark: Sì, sembra essere il nuovo URL, ho aggiornato la mia risposta. Per la versione precedente, consultare https://web.archive.org/web/20101121120543/http://www.scipy.org/Cookbook/Matplotlib/Show_colormaps – janneb

7

provare questo:

import pylab 
from scipy import misc 

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

non c'è 'pylab.grey()', forse è stato rimosso? –

+9

Wow ... Lena è inclusa in scipy ... – wlnirvana

+1

no, non più in 0.18.0 – IljaBek

10

import matplotlib.pyplot as plt

È inoltre possibile eseguire una volta nel codice

plt.gray() 

Questo mostrerà le immagini in scala di grigi come predefinito

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

funziona, ma la chiamata è 'grigio()', no? –

+0

Quale libreria stai usando per 'gray()' o 'gray()'? – SherylHohman

7

Vorrei usare il metodo get_cmap. Es .:

import matplotlib.pyplot as plt 

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

Sembra semplice e funziona perfettamente. – arsho

0

La risposta di @ unutbu è abbastanza vicina alla risposta corretta.

Per impostazione predefinita, plt.imshow() proverà a scalare i dati dell'array (MxN) su 0.0 ~ 1.0. E quindi mappare su 0 ~ 255. Per la maggior parte delle immagini naturali scattate, va bene, non vedrai un altro. Ma se hai una gamma ristretta di immagini con valori di pixel, diciamo che il pixel minimo è 156 e il pixel massimo è 234. L'immagine grigia sembrerà completamente sbagliata. Il modo giusto per mostrare un'immagine in grigio è

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

Vediamo un esempio:

questa è l'immagine origianl: original

questo sta usando impostazione norma defaul, che non è: wrong pic

questo sta usando impostazione NoNorm, che è NoNorm(): right pic

Problemi correlati