Domanda

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

o

rgbImage = grayImage / 255;

Quale di quanto sopra è giusto, e la ragione?

È stato utile?

Soluzione

Per convertire un'immagine di in scala di grigi a un'immagine RGB , ci sono due problemi che si devono affrontare:

  • immagini in scala di grigi sono 2-D, mentre RGB immagini sono 3-D, in modo da avere per replicare i dati dell'immagine in scala di grigi per tre volte e concatenare i tre copie lungo una terza dimensione.
  • I dati delle immagini possono essere memorizzate in molti diversi tipi di dati , in modo da avere per la conversione di conseguenza. Se conservato come double tipo di dati, i valori di pixel dell'immagine dovrebbero essere numeri in virgola mobile nell'intervallo da 0 a 1. Se conservato come uint8 tipo di dati, i valori dei pixel di immagine deve essere interi compresi tra 0 e 255. È possibile verificare il tipo di dati di una matrice dell'immagine usando la funzione class .

Qui ci sono 3 condizioni tipiche che si possono incontrare:

  • Per convertire un uint8 o double scala di grigi immagine a un'immagine RGB di lo stesso tipo di dati , è possibile utilizzare le funzioni repmat o cat :

    rgbImage = repmat(grayImage,[1 1 3]);
    rgbImage = cat(3,grayImage,grayImage,grayImage);
    
  • Per convertire un uint8 scala di grigi immagine in un double immagine RGB, si dovrebbe convertire in double prima, poi scala da 255:

    rgbImage = repmat(double(grayImage)./255,[1 1 3]);
    
  • Per convertire un double scala di grigi immagine in un uint8 immagine RGB, si dovrebbe scalare da 255, poi convertire in uint8 :

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

Altri suggerimenti

Per definizione, un'immagine RGB ha 3 canali, il che implica hai bisogno di una matrice tridimensionale per rappresentare l'immagine. Quindi, la risposta giusta è:

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

Fare attenzione quando si normalizzante grayImage. Se grayImage è uint8 poi si perde un po 'di precisione nell'operazione 255*grayImage/max(grayImage(:)).

Inoltre, grayImage normalizzazione dipende dai dati. Nella tua domanda, è stato utilizzato due metodi:

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

che normalizza scala di grigio tale che il valore massimo nell'immagine è 1 e

rgbImage = grayImage / 255;

che senso solo se i valori in grayImage trovano nell'intervallo 0-255.

Quindi dipende da cosa si vuole fare. Ma, se si vuole un'immagine RGB è necessario per convertire il vostro matrice a singolo canale ad una matrice a 3 canali.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top