Zeigen Sie das Bild mit matplotlib als Graustufen an

231

Ich versuche, mit matplotlib.pyplot.imshow () ein Graustufenbild anzuzeigen . Mein Problem ist, dass das Graustufenbild als Farbkarte angezeigt wird. Ich brauche die Graustufen, weil ich mit Farbe über das Bild zeichnen möchte.

Ich lese das Bild ein und konvertiere es mit PILs Image.open () in Graustufen. Convert ("L")

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

Dann konvertiere ich das Bild in eine Matrix, damit ich leicht eine Bildverarbeitung mit durchführen kann

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

Wenn ich es jedoch tue

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

Es zeigt das Bild mit einer Farbkarte an (dh es ist keine Graustufe).

Was mache ich hier falsch?

Ryan
quelle

Antworten:

368

Der folgende Code lädt ein Bild aus einer Datei image.pngund zeigt es als Graustufen an.

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

Wenn Sie die inverse Graustufe anzeigen möchten, wechseln Sie die cmap zu cmap='gray_r'.

unutbu
quelle
4
@jay: In dieser Dokumentzeichenfolge heißt es: "Beachten Sie, dass jede hier aufgeführte Farbkarte durch Anhängen umgekehrt werden kann _r."
Unutbu
31
Warnung matplotlib Passen Sie die Intensität der Pixelskala an, wenn Sie nicht verwenden möchten:plt.imshow(im_gray,cmap='gray', vmin = 0, vmax = 255)
themadmax
17

import matplotlib.pyplot as plt

Sie können Ihren Code auch einmal ausführen

plt.gray()

Dadurch werden die Bilder standardmäßig in Graustufen angezeigt

im = array(Image.open('I_am_batman.jpg').convert('L'))
plt.imshow(im)
plt.show()
Eliel Van Hojman
quelle
Für welche Bibliothek verwenden Sie gray()oder grey()?
SherylHohman
@SherylHohman, es ist gray... Grau ist amerikanische Standardschreibweise und Grau ist britische Rechtschreibung für dieselbe Farbe.
Cloud Cho
12

Ich würde die Methode get_cmap verwenden. Ex.:

import matplotlib.pyplot as plt

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

Die Antwort von @ unutbu kommt der richtigen Antwort ziemlich nahe.

Standardmäßig versucht plt.imshow (), Ihre (MxN) Array-Daten auf 0,0 ~ 1,0 zu skalieren. Und dann auf 0 ~ 255 abbilden. Für die meisten natürlich aufgenommenen Bilder ist dies in Ordnung, Sie werden keinen anderen sehen. Wenn Sie jedoch einen engen Bereich von Pixelwertbildern haben, sagen wir, das minimale Pixel ist 156 und das maximale Pixel ist 234. Das graue Bild sieht völlig falsch aus. Der richtige Weg, um ein Bild in Grau anzuzeigen, ist

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

Sehen wir uns ein Beispiel an:

Dies ist das ursprüngliche Bild: Original

Hierbei wird die Standardeinstellung "Norm" verwendet. Dies ist "Keine: falsches Bild"

Dies verwendet die NoNorm-Einstellung NoNorm (): rechtes Bild

Stanley
quelle
9

Versuche dies:

import pylab
from scipy import misc

pylab.imshow(misc.lena(),cmap=pylab.gray())
pylab.show()
Baco
quelle
gibt es nein pylab.grey(), vielleicht wurde es entfernt?
Lyndon White
4

Verwenden Sie keine Interpolation und setzen Sie auf grau.

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