Ihr Bild ist ein "indexiertes" Bild. Das bedeutet, dass es ganzzahlige Werte enthält, die mehr als alles andere als "Etiketten" fungieren, und jede dieser Markierungen wird einer Farbe zugeordnet (d. H. Einem rgb-Triplett). Ihre map
Variable repräsentiert diese Zuordnung; In Zeile 5 haben Sie das rgb-Triplet, das zum Beispiel "label" "5" entspricht.
Um zu sehen, was ich meine, tun Sie unique(img)
und Sie werden sehen, dass die Werte Ihrer img
Array in der Tat ziemlich regelmäßig sind. Der Befehl rgbplot
kann die tatsächliche Farbkarte grafisch darstellen. Führen Sie rgbplot(map)
auf Ihrer Kartenvariablen aus, um die Zuordnung für jede der Farben Rot Grün und Blau zu sehen.
Jetzt speichern und lesen Sie das Bild unten auf Ihrem Computer als img2
und vergleichen Sie die Array-Werte. mit photoediting Software (GIMP)
Dieses Bild wurde durch die Umwandlung von dem „indiziert“ Bild, das Sie zu einem „Graustufen“ einen verknüpft erzeugt. Der Unterschied ist, dass in einem Graustufenbild die Pixelwerte tatsächliche Intensitäten darstellen, anstatt ganzer "Etiketten". Imread liest Graustufenbilder standardmäßig als uint8
-Bilder, dh, es weist den Pixelwerten von 0 (schwarz) bis 255 (weiß) Intensitätswerte zu. Da es sich bei diesen Werten um Ganzzahlen handelt, können Sie sie trotzdem als "Etiketten" betrügen und behandeln und auf ihnen eine Farbzuordnung erzwingen. Aber wenn Sie eine 'lineare Karte' zuweisen (d. H. Wert 1 = Intensität 1, Wert 2 = Intensität 2 usw.), dann wird Ihr Bild so aussehen, wie Sie es erwarten würden.
Sie werden sehen, dass die Werte von unique(img2)
ziemlich unterschiedlich sind. Wenn Sie imshow(img2)
sehen, wird dies wie erwartet angezeigt. Wenn Sie keine Colormap für imshow angeben, wird angenommen, dass die Map eine lineare Abbildung vom niedrigsten zum höchsten Wert im Image-Array ist. Dies erklärt, warum Ihr indiziertes Image seltsam aussah, da seine Werte niemals übereinstimmen sollten zu Intensitäten.
Versuchen Sie auch imagesc(img2)
, die dies aber unter Verwendung der "aktuellen" Colormap zeigen. imagesc
bewirkt, dass die Colormap "skaliert" wird, sodass die niedrigste Farbe zum niedrigsten Wert im Bild und ähnlich zum höchsten Wert geht. Die Standard-Colormap ist jet
. Sie sollten also ein psychedelisch aussehendes Bild sehen, aber Sie sollten in der Lage sein, Lena klar zu erkennen. Wenn Sie versuchen, colormap gray
sollten Sie die graue Version wieder sehen. Versuchen Sie auch colormap hot
. Um nun die Colormaps zu verstehen, versuchen Sie es mit dem Befehl rgbplot
(z. B. rgbplot(gray)
, rgbplot(hot)
usw.).
Zurück zur Imshow, imshow können Sie im Grunde ein indiziertes Bild anzeigen und angeben, welche Colormap Sie verwenden möchten, um es anzuzeigen. Wenn Sie die Colormap nicht angeben, wird nur eine lineare Interpolation vom niedrigsten zum höchsten Wert Ihrer Map verwendet. Daher wird imshow (img) das Bild genauso darstellen wie imagesc (img) mit einer grauen Colormap. Und da die Werte in Ihrem ersten img
gleichmäßig "Labels" statt tatsächliche Intensitäten darstellen, erhalten Sie ein Müllbild aus.
EDIT: Wenn Sie Ihr indizierte Bild in ein Graustufenbild konvertieren möchten, Matlab stellt die ind2gray
Funktion, zB:
[img, map] = imread('lena.bmp');
img_gray = ind2gray(img, map);
Dies ist wahrscheinlich das, was Sie brauchen, wenn Sie Pixelwerte zu verarbeiten bedeuten als Intensitäten.
Was ist der maximale und minimale Wert der 'img'-Matrix, die Sie als Ausgabe erhalten? – Prakhar