Wyświetl obraz w skali szarości za pomocą matplotlib

231

Próbuję wyświetlić obraz w skali szarości za pomocą matplotlib.pyplot.imshow () . Mój problem polega na tym, że obraz w skali szarości jest wyświetlany jako mapa kolorów. Potrzebuję skali szarości, ponieważ chcę rysować na obrazie kolorem.

Czytam na obrazie i przekonwertowałem na skalę szarości za pomocą PIL's Image.open (). Convert („L”)

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

Następnie przekonwertowałem obraz na matrycę, dzięki czemu mogę łatwo wykonać przetwarzanie obrazu za pomocą

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

Jednak kiedy to zrobię

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

wyświetla obraz za pomocą mapy kolorów (tzn. nie jest w skali szarości).

Co ja tu robię źle?

Ryan
źródło

Odpowiedzi:

368

Poniższy kod załaduje obraz z pliku image.pngi wyświetli go w skali szarości.

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()

Jeśli chcesz wyświetlić odwrotną skalę szarości, zmień cmap na cmap='gray_r'.

unutbu
źródło
4
@jay: Zgodnie z tym ciągiem dokumentu „zauważ, że każda mapa kolorów wymieniona tutaj może zostać odwrócona poprzez dołączenie _r”.
unutbu
31
Ostrzeżenie matplotlib dostosuj intensywność skali pikseli, jeśli nie chcesz używać:plt.imshow(im_gray,cmap='gray', vmin = 0, vmax = 255)
themadmax
17

import matplotlib.pyplot as plt

Możesz także uruchomić raz w kodzie

plt.gray()

Spowoduje to wyświetlenie domyślnie obrazów w skali szarości

im = array(Image.open('I_am_batman.jpg').convert('L'))
plt.imshow(im)
plt.show()
Eliel Van Hojman
źródło
Z jakiej biblioteki korzystasz gray()lub grey()?
SherylHohman,
@ SherylHohman, to jest gray... szary to standardowa amerykańska pisownia, a szary to brytyjska pisownia dla tego samego koloru.
Cloud Cho
12

Użyłbym metody get_cmap. Dawny.:

import matplotlib.pyplot as plt

plt.imshow(matrix, cmap=plt.get_cmap('gray'))
Al Conrad
źródło
11

Odpowiedź @ unutbu jest zbliżona do właściwej odpowiedzi.

Domyślnie plt.imshow () próbuje przeskalować dane macierzy (MxN) do 0,0 ~ 1,0. A następnie zamapuj na 0 ~ 255. W przypadku większości naturalnych zdjęć jest to w porządku, nie zobaczysz inaczej. Ale jeśli masz wąski zakres wartości obrazu w pikselach, powiedz, że minimalny piksel to 156, a maksymalny piksel to 234. Szary obraz będzie wyglądał zupełnie źle. Właściwy sposób wyświetlania obrazu w kolorze szarym to

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

Zobaczmy przykład:

to jest oryginał : oryginał

wykorzystuje to ustawienie normy defaul, czyli None: złe zdjęcie

używa to ustawienia NoNorm, którym jest NoNorm (): prawy obrazek

Stanley
źródło
9

Spróbuj tego:

import pylab
from scipy import misc

pylab.imshow(misc.lena(),cmap=pylab.gray())
pylab.show()
Baco
źródło
nie ma pylab.grey(), może został usunięty?
Lyndon White,
4

Nie używaj interpolacji i ustaw kolor na szary.

import matplotlib.pyplot as plt
plt.imshow(img[:,:,1], cmap='gray',interpolation='none')
użytkownik3452134
źródło