2010-04-12 26 views

Respuesta

22

Para convertir un grayscale image a un RGB image, hay dos cuestiones que hay que abordar:

  • Grayscale images son 2-D, mientras que RGB images son 3-D, lo que tiene que replicar los datos de la imagen en escala de grises de tres veces y concatenar las tres copias a lo largo de una tercera dimensión.
  • Los datos de imagen se pueden almacenar en muchos data types, por lo que debe convertirlos en consecuencia. Cuando se almacena como un tipo de datos double, los valores de pixel de imagen deben ser números de punto flotante en el rango de 0 a 1. Cuando se almacena como un tipo de datos uint8, los valores de los píxeles de imagen deben ser enteros en el rango de 0 a 255. Se puede verifique el tipo de datos de una matriz de imagen usando la función class.

Aquí hay 3 condiciones típicas que se puede encontrar:

  • para convertir una imagen en escala de grises uint8 o double a una imagen RGB de el mismo tipo de datos, puede utilizar las funciones repmat o cat :

    rgbImage = repmat(grayImage,[1 1 3]); 
    rgbImage = cat(3,grayImage,grayImage,grayImage); 
    
  • Para convertir un gra uint8 imagen yscale una imagen de double RGB a, se debe convertir a double primero, y luego la escala de 255:

    rgbImage = repmat(double(grayImage)./255,[1 1 3]); 
    
  • para convertir una imagen en escala de grises double una imagen de uint8 RGB a, debe escalar por 255 primero, y luego convertir a uint8:

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

Acabo de hacer una prueba, parece 'double (grayImage)' es lo mismo que 'grayImage'? Y son'./'Y'. * 'Los operadores de división y producto en MATLAB? Parece que '. /' Es lo mismo que '/'? – user198729

+0

@ user198729: Los operadores '. /' Y '. *' Indican * división y multiplicación de elemento *, de modo que cada elemento de la matriz de imagen se divide o se multiplica por 255. Puede verificar la clase (es decir, tipo de datos) de una matriz escribiendo 'clase (grayImage)'. Si bien 'double (grayImage)' y 'grayImage' podrían * aparecer * para ser iguales, cada una de ellas puede ser una clase diferente (de modo que almacenen sus valores de diferentes maneras). – gnovice

+0

Probé varias operaciones, pero '/' y '. /' Nunca dan un resultado diferente ... Y porque 'double (grayImage)' es lo mismo que 'grayImage',' double (grayImage) ./ 255' también es lo mismo que 'grayImage./255'.So¿puede dar dos ejemplos que demuestren por qué'./'y' double' son necesarios? – user198729

2

Por definición, una imagen RGB tiene 3 canales, lo que implica que necesita una matriz tridimensional para representar la imagen. Por lo tanto, la respuesta correcta es:

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

Tenga cuidado al normalizar grayImage. Si grayImage es uint8, perderá cierta precisión en la operación 255*grayImage/max(grayImage(:)).

Además, la normalización de grayImage depende de los datos. En su pregunta, que utilizó dos métodos:

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

que normaliza la imagen en escala de grises de tal manera que el valor máximo de la imagen es 1 y

rgbImage = grayImage/255; 

que sólo tiene sentido si los valores en grayImage se encuentran en el rango 0-255.

Por lo tanto, realmente depende de lo que quiere hacer. Pero, si desea una imagen RGB, necesita convertir su matriz de un solo canal en una matriz de 3 canales.

+0

pensé que, por definición, el valor máximo de '' 1' rgbImage' es, lo que denota 'white', pero esto no parece ser el caso? – user198729

+0

No realmente, depende del uso que haga de la imagen. – Jacob

Cuestiones relacionadas