Visualizza l'immagine in scala di grigi usando matplotlib


231

Sto cercando di visualizzare un'immagine in scala di grigi usando matplotlib.pyplot.imshow () . Il mio problema è che l'immagine in scala di grigi viene visualizzata come mappa di colori. Ho bisogno della scala di grigi perché voglio disegnare sull'immagine con colori.

Ho letto nell'immagine e convertito in scala di grigi usando Image.open (). Convert ("L") di PIL

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

Quindi converto l'immagine in una matrice in modo da poter eseguire facilmente l'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 dei colori (cioè non è in scala di grigi).

Cosa sto facendo di sbagliato qui?

Risposte:


368

Il seguente codice caricherà un'immagine da un file image.pnge la visualizzerà 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', vmin=0, vmax=255)
plt.show()

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


4
@jay: secondo questa stringa di documento , "Nota che qualsiasi mappa di colori elencata qui può essere annullata aggiungendo _r".
unutbu,

31
Avvertenza matplotlib regola l'intensità della scala dei pixel se non vuoi usarlo:plt.imshow(im_gray,cmap='gray', vmin = 0, vmax = 255)
themadmax


17

import matplotlib.pyplot as plt

Puoi anche eseguirlo una volta nel tuo codice

plt.gray()

Questo mostrerà le immagini in scala di grigi come impostazione predefinita

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

Per quale libreria stai utilizzando gray()o grey()?
SherylHohman,

@SherylHohman, è gray... il grigio è l'ortografia americana standard e il grigio è l'ortografia britannica per lo stesso colore.
Cloud Cho

12

Vorrei usare il metodo get_cmap. Ex.:

import matplotlib.pyplot as plt

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

11

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

Per impostazione predefinita, plt.imshow () proverà a ridimensionare i dati dell'array (MxN) su 0,0 ~ 1,0. E quindi mappare a 0 ~ 255. Per la maggior parte delle immagini naturali, questo va bene, non vedrai nulla di diverso. Ma se hai una gamma ristretta di immagini con valore pixel, supponi che il pixel minimo sia 156 e il pixel massimo sia 234. L'immagine grigia apparirà totalmente 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 originale : originale

questo sta usando l'impostazione della norma di default, che è None: foto sbagliata

questo sta usando l'impostazione NoNorm, che è NoNorm (): immagine a destra


9

prova questo:

import pylab
from scipy import misc

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

no pylab.grey(), forse è stato rimosso?
Lyndon White,

4

Non usare interpolazione e impostare su grigio.

import matplotlib.pyplot as plt
plt.imshow(img[:,:,1], cmap='gray',interpolation='none')
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.