2010-04-12 11 views

Antwort

22

Um ein grayscale image zu einem RGB image, zu konvertieren gibt es zwei Fragen müssen Sie Adresse:

  • Grayscale images sind 2-D, während RGB images 3-D sind, so dass Sie drei die Graustufen-Bilddaten zu replizieren Zeiten und verketten die drei Kopien entlang einer dritten Dimension.
  • Bilddaten können in vielen verschiedenen data types gespeichert werden, so müssen Sie sie entsprechend konvertieren. Bei Speicherung als double-Datentyp sollten die Bildpixelwerte Gleitkommazahlen im Bereich von 0 bis 1 sein. Bei Speicherung als -Datentyp sollten die Bildpixelwerte Ganzzahlen im Bereich von 0 bis 255 sein. Sie können Überprüfen Sie den Datentyp einer Bildmatrix mit der Funktion class.

Hier sind drei typische Bedingungen auftreten können:

  • Um ein uint8 oder double Graustufenbild in ein RGB-Bild von den gleichen Datentyp, konvertieren können Sie die Funktionen nutzen repmat oder cat :

    rgbImage = repmat(grayImage,[1 1 3]); 
    rgbImage = cat(3,grayImage,grayImage,grayImage); 
    
  • Um einen uint8 gra zu konvertieren yscale Bild zu einem double RGB-Bild, sollten Sie double zuerst konvertieren, dann Skala von 255:

    rgbImage = repmat(double(grayImage)./255,[1 1 3]); 
    
  • Um ein double Graustufenbild zu einem uint8 RGB-Bild zu konvertieren, sollten Sie von 255 zuerst skalieren, umwandeln dann uint8:

    rgbImage = repmat(uint8(255.*grayImage),[1 1 3]); 
    
+0

Ich habe gerade einen Test gemacht, scheint 'double (grayImage)' ist das gleiche wie 'grayImage'? Und sind'./'Und'. * 'Teile und Produktoperatoren in MATLAB? Scheint '. /' Ist das gleiche wie '/'? – user198729

+0

@ user198729: Die Operatoren '. /' Und '. *' Bezeichnen * elementweise * Division und Multiplikation, so dass jedes Element der Bildmatrix durch 255 geteilt oder multipliziert wird. Sie können die Klasse (dh den Datentyp) überprüfen) einer Matrix durch Eingabe von 'class (greyImage)'. Während "double (greyImage)" und "greyImage" * als identisch erscheinen mögen, können sie jeweils eine andere Klasse sein (so dass sie ihre Werte auf unterschiedliche Weise speichern). – gnovice

+0

Ich habe verschiedene Operationen ausprobiert, aber '/' und '. /' Geben nie ein anderes Ergebnis ... Und weil 'double (greyImage)' dasselbe wie 'greyImage' ist, ist' double (greyImage) ./ 255' auch das gleiche wie 'grayImage./255'.So, können Sie zwei Beispiele angeben, warum'./'und' double' notwendig sind? – user198729

2

Per Definition hat ein RGB-Bild 3 Kanäle, was bedeutet, dass Sie eine dreidimensionale Matrix benötigen, um das Bild darzustellen. Also, die richtige Antwort ist:

rgbImage = repmat(255*grayImage/max(grayImage(:)),[1 1 3]); 

Vorsicht beim grayImage normalisieren. Wenn grayImageuint8 ist, werden Sie in der Operation 255*grayImage/max(grayImage(:)) etwas Genauigkeit verlieren.

Auch das Normalisieren grayImage hängt von den Daten ab. In Ihrer Frage, verwendete man zwei Methoden:

rgbImage = grayImage/max(max(grayImage)); 

, die das Graustufenbild so normalisiert, dass der Maximalwert in dem Bild zu 1 und

rgbImage = grayImage/255; 

, die nur dann Sinn macht, wenn die Werte in grayImage liegt in der 0-255 Bereich.

So hängt es wirklich davon ab, was Sie tun möchten. Wenn Sie jedoch ein RGB-Bild wünschen, müssen Sie Ihre Einkanal-Matrix in eine 3-Kanal-Matrix konvertieren.

+0

ich dachte, dass der maximale Wert von 'rgbImage' per Definition ist '1', das' bezeichnet white', aber dies scheint nicht der Fall? – user198729

+0

Nicht wirklich, es hängt von Ihrer Verwendung des Bildes ab. – Jacob