Estoy revisando las máscaras de segmentación de la verdad básica del pascal voc 2012 dataset. Estos son archivos png uint de un solo canal de 8 bits. Sin embargo, cuando abro estas imágenes en el explorador de archivos (nautilus) o en el visor de imágenes (eog), se muestran en colores.
¿No debería mostrarse en escala de grises?
Cuando almaceno una imagen como archivo uint png de un solo canal de 8 bits usando Matlab, se muestra en escala de grises como se esperaba. ¿Cuál es la diferencia entre diferentes tipos de archivos png?
¿Cómo puedo almacenarlo de manera que mi visor de imágenes los muestre en colores?

Este es el png de canal único original:
este es el png de canal único original

Este es el resultado después de imread y imwrite. Tenga en cuenta que NO se ha agregado / eliminado ningún canal:
este es el resultado después de <code> imread </code> y <code> imwrite  </code> NO se ha añadido / eliminado NINGÚN canal

5
mcExchange 22 nov. 2017 a las 18:41

2 respuestas

La mejor respuesta

Sus archivos de imagen contienen imágenes indexadas, con una matriz de índice M-por-N y una matriz de mapa de colores P-por-3. ¿Cómo puedes saberlo? Debe obtener el segundo resultado de imread cuando cargando tus imágenes:

[img, cmap] = imread('zuIra.png');
if isempty(cmap)
  % Process data as a grayscale or RGB image
else
  % Process data as an indexed image
end

Si cmap está vacío, tus datos son un M-by-N imagen de intensidad en escala de grises o una M-por-N-por-3 Imagen Truecolor RGB. De lo contrario, está tratando con una imagen en color indexada y tendrá que usar ambos datos en cualquier procesamiento de su imagen, como verla con imshow:

imshow(img, cmap);

O al volver a guardar los datos con imwrite:

imwrite(img, cmap, 'outfile.png');

Si prefiere trabajar con una única matriz de datos de imagen (que puede facilitar el procesamiento en algunos casos), puede convertir los datos de la imagen indexada y el mapa de colores asociado en una imagen RGB con ind2rgb:

imgRGB = ind2rgb(img, cmap);
2
gnovice 23 nov. 2017 a las 04:29

Se trata de una 1 to 8 bits (variable) por píxel PNG con indexed colors.

Cuando un formato utiliza esta técnica, la información de color no se almacena directamente en los datos de píxeles de la imagen, sino en una pieza de datos separada llamada palette. Un palette se puede definir como una matriz predefinida de colores en la que cada elemento define la representación tricromática (RGB) de un color específico (8 bits por canal, para un total de {{X4 }}).

Los datos de píxeles de la imagen no contienen la especificación completa de un color en la forma RGB, sino solo los índices de los colores de la paleta. Por supuesto, el palette debe contener una entrada para cada color de píxel presente en la imagen.

Este enfoque puede verse como una forma de compresión, en la que solo está disponible un conjunto limitado de colores para ahorrar memoria / almacenamiento y acelerar la visualización de la imagen.

En pocas palabras, el resultado de su llamada imread no le devuelve la información de color de la imagen. Su matriz contiene los índices de los elementos de la paleta PNG.

Ejemplo

Digamos que tiene n PNG indexado que tiene un ancho de 3 píxeles y un alto de 1 píxel. El primer píxel es rojo puro, el segundo píxel es verde puro y el tercer píxel es azul puro.

En los datos binarios PNG, el fragmento PLTE contendrá las siguientes definiciones de color:

[255 0 0] % Pure Red
[0 255 0] % Pure Green
[0 0 255] % Pure Blue

Y el fragmento IHDR definirá un solo canal con los siguientes datos:

0 1 2

% 0 = index to the first palette color, pure red
% 1 = index to the second palette color, pure green
% 2 = index to the third palette color, pure blue
0
Tommaso Belluzzo 23 nov. 2017 a las 10:10