Come convertire una matrice in scala di grigi ad una matrice RGB in MATLAB?
Domanda
rgbImage = grayImage / max(max(grayImage));
o
rgbImage = grayImage / 255;
Quale di quanto sopra è giusto, e la ragione?
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 comeuint8
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 funzioneclass
.
Qui ci sono 3 condizioni tipiche che si possono incontrare:
-
Per convertire un
uint8
odouble
scala di grigi immagine a un'immagine RGB di lo stesso tipo di dati , è possibile utilizzare le funzionirepmat
ocat
:rgbImage = repmat(grayImage,[1 1 3]); rgbImage = cat(3,grayImage,grayImage,grayImage);
-
Per convertire un
uint8
scala di grigi immagine in undouble
immagine RGB, si dovrebbe convertire indouble
prima, poi scala da 255:rgbImage = repmat(double(grayImage)./255,[1 1 3]);
-
Per convertire un
double
scala di grigi immagine in unuint8
immagine RGB, si dovrebbe scalare da 255, poi convertire inuint8
: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.