2016-04-06 8 views
2

Ich habe Daten über die Pixel in dem folgende Format (B, G, R)eine Matrix von Pixeln zu einem Bild Python

M = [ 
    [(0, 0, 255), (0, 255, 0)], 
    [(255, 0, 0), (0, 0, 0)] 
] 

was bedeutet, dass es sich um ein 2D-Bild, in dem ersten Pixel rot ist, Die zweite ist Grün, die dritte ist Blau und die letzte ist Schwarz. Offensichtlich ist mein Originalbild ziemlich groß, also ist 2x2 nur ein Beispiel. Grundsätzlich gilt:

red, blue 
green, black 

Ich möchte diese Daten als Bild darstellen:

from matplotlib import pyplot as plt 
plt.imshow(np.array(M), interpolation='none') 
plt.show() 

aber das gibt mir eine absolut leer (schwarz) auf dem Bildschirm. Gibt es eine einfache Möglichkeit, ein schönes 2x2-Pixel-Bild zu erhalten?

Antwort

4

Sie müssen das Bild nicht unbedingt in normalisierte Gleitkommazahlen konvertieren. Sie haben es in der richtigen Form (MxNx3) und im richtigen Bereich (0-255), aber es muss vom Typ np.uint8 sein. Von documentation

X: array_like, die Form (n, m) oder (n, m, 3) oder (n, m, 4)

Anzeige des Bild in X der aktuellen Achsen. X kann ein Float-Array, ein Uint8-Array oder ein PIL-Bild sein. Wenn X eine Gruppe ist, kann es die folgenden Formen haben:

MxN - Luminanz (Graustufen, float Array nur)
MxNx3 - RGB (float oder uint8 array)
MxNx4 - RGBA (float oder uint8 array)

Allerdings sind Ihre Array-Daten im BGR-Format, daher müssen Sie die dritte Dimension umkehren, um sie in das RGB-Format zu bringen.

image = np.array(M, dtype=np.uint8)[...,::-1] 

Ein weiterer Aspekt, der meine Aufmerksamkeit gefangen ist Ihre Definition der Daten. Die Liste der Listen stellt die Zeilen zuerst dar, so dass M tatsächlich rot/grün in der ersten Zeile und blau/schwarz in der zweiten Zeile hat. Wenn Sie die Pixel in der Reihenfolge wünschen, in der Sie sie angegeben haben, d. H. Rot/blau und grün/schwarz, müssen Sie die Zeilen mit den Spalten transponieren.

image_transp = np.transpose(image, (1, 0, 2)) 

Jetzt können Sie zeichnen je nachdem, welche Bilddarstellung ist die richtige (image oder image_transp).Für letztere erhalten Sie

plt.imshow(image_transp, interpolation='none') 

enter image description here

4

Die Werte Ihres RGB-Arrays müssen die gewünschte Farbe darstellen. die einfachste ist vielleicht RGB-Werte schwimmt in [0, 1] zu konvertieren: (konvertieren [0, 255] --> [0, 1])

import numpy 
import matplotlib.pyplot as plt 
randim_image1 = numpy.asarray([[(0., 0., 1.), (0., 1., 0.)], [(1., 0., 0.), (0., 0., 0.)]]) 

plt.imshow(image1, interpolation="none") 

enter image description here

Verwandte Themen