2016-07-19 16 views
0

Ich habe Graustufenbild "lena.bmp". Ich möchte dieses Bild in Matlab mit der Funktion imread() lesen. Wenn ich den Code unten zum Lesen und Anzeigen von Bildern verwende, ist mein Bild dunkel (schwarz).Graustufenbild in Matlab lesen

img = imread('lena.bmp'); 
    imshow(img); 

Aber wenn ich Code unten verwende, habe ich kein Problem zu sehen.

[img map]= imread('lena.bmp'); 
    imshow(img,map); 

Es scheint, dass mein erster Code Dosen Bild in Graustufen-Modus nicht lesen (wie das, was rgb2gray Funktion erzeugen).

Mein Bild ist wie folgt:

enter image description here

Was kann ich tun, um dieses Problem zu lösen?

+0

Was ist der maximale und minimale Wert der 'img'-Matrix, die Sie als Ausgabe erhalten? – Prakhar

Antwort

3

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)

enter image description here

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.