Mostrar imagen como escala de grises con matplotlib

231

Estoy tratando de mostrar una imagen en escala de grises usando matplotlib.pyplot.imshow () . Mi problema es que la imagen en escala de grises se muestra como un mapa de colores. Necesito la escala de grises porque quiero dibujar en la parte superior de la imagen con color.

Leí en la imagen y la convertí a escala de grises usando Image.open (). Convert ("L") de PIL

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

Luego convierto la imagen a una matriz para que pueda hacer un poco de procesamiento de imágenes usando

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

Sin embargo, cuando lo hago

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

muestra la imagen usando un mapa de colores (es decir, no es en escala de grises).

¿Qué estoy haciendo mal aquí?

Ryan
fuente

Respuestas:

368

El siguiente código cargará una imagen de un archivo image.pngy la mostrará como escala de grises.

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 desea mostrar la escala de grises inversa, cambie cmap a cmap='gray_r'.

unutbu
fuente
44
@jay: Según esta cadena de documentación , "Tenga en cuenta que cualquier mapa de color que se enumere aquí puede revertirse agregando _r".
unutbu
31
Advertencia matplotlib ajusta la intensidad de la escala de píxeles si no desea usar:plt.imshow(im_gray,cmap='gray', vmin = 0, vmax = 255)
themadmax
17

import matplotlib.pyplot as plt

También puede ejecutar una vez en su código

plt.gray()

Esto mostrará las imágenes en escala de grises por defecto

im = array(Image.open('I_am_batman.jpg').convert('L'))
plt.imshow(im)
plt.show()
Eliel Van Hojman
fuente
¿Para qué biblioteca estás utilizando gray()o grey()?
SherylHohman
@SherylHohman, es gray... el gris es la ortografía estadounidense estándar y el gris es la ortografía británica para el mismo color.
Cloud Cho
12

Usaría el método get_cmap. Ex.:

import matplotlib.pyplot as plt

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

La respuesta de @unutbu está bastante cerca de la respuesta correcta.

Por defecto, plt.imshow () intentará escalar sus datos de matriz (MxN) a 0.0 ~ 1.0. Y luego mapear a 0 ~ 255. Para la mayoría de las imágenes tomadas de forma natural, está bien, no verá una diferente. Pero si tiene un rango estrecho de imagen de valor de píxel, digamos que el píxel mínimo es 156 y el píxel máximo es 234. La imagen gris se verá totalmente incorrecta. La forma correcta de mostrar una imagen en gris es

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

Veamos un ejemplo:

Esta es la imagen original : original

esto está usando la configuración de la norma predeterminada, que es Ninguno: imagen incorrecta

esto está usando la configuración NoNorm, que es NoNorm (): foto derecha

Stanley
fuente
9

prueba esto:

import pylab
from scipy import misc

pylab.imshow(misc.lena(),cmap=pylab.gray())
pylab.show()
baco
fuente
no hay pylab.grey(), tal vez ha sido eliminado?
Lyndon White el
4

No use interpolación y configúrelo en gris.

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