Main Content

Imágenes de 8 y 16 bits

Imágenes indexadas

Los números en punto flotante de doble precisión (64 bits) son la representación predeterminada de MATLAB® para los datos numéricos. No obstante, para reducir los requisitos de memoria y trabajar con las imágenes, puede almacenar las imágenes como enteros de 8 bits o 16 bits sin signo mediante las clases numéricas uint8 o uint16, respectivamente. Una imagen cuya matriz de datos tiene la clase uint8 se denomina imagen de 8 bits, mientras que una imagen cuya matriz de datos tiene la clase uint16 se denomina imagen de 16 bits.

La función image puede mostrar imágenes de 8 o 16 bits directamente sin convertirlas a doble precisión. Sin embargo, image interpreta los valores de la matriz de una forma ligeramente diferente cuando la matriz de la imagen es uint8 o uint16. La interpretación específica varía en función del tipo de imagen.

Si la clase de X es uint8 o uint16, sus valores presentan un desfase de 1 antes de utilizarlos como índices del mapa de colores. El valor 0 hace referencia a la primera fila del mapa de colores, el valor 1 a la segunda fila, y así sucesivamente. El comando image proporciona automáticamente el desfase adecuado, por lo que el método de visualización es el mismo si X es double, uint8 o uint16:

image(X); colormap(map);

El desfase del índice del mapa de colores de los datos de uint8 y uint16 tiene como finalidad admitir los formatos de archivos gráficos estándar, que suelen almacenar los datos de imagen en una forma indexada con un mapa de colores de 256 entradas. Este desfase le permite editar y mostrar imágenes de esta forma con unos arreglos de uint8 y uint16 más eficientes desde el punto de vista de la memoria.

Debido al desfase, tiene que sumar 1 para convertir una imagen indexada uint8 o uint16 en double. Por ejemplo:

X64 = double(X8) + 1;
	or
X64 = double(X16) + 1;

A la inversa, reste 1 para convertir una imagen indexada double en uint8 o uint16:

X8 = uint8(X64 - 1);
	or
X16 = uint16(X64 - 1);

Imágenes de intensidad

El rango de los arreglos de imagen double suele ser [0, 1], pero el rango de las imágenes de intensidad de 8 bits suele ser [0, 255] y el rango de las imágenes de intensidad de 16 bits suele ser [0, 65535]. Utilice el siguiente comando para mostrar una imagen de intensidad de 8 bits con un mapa de colores de escala de grises:

imagesc(I,[0 255]); colormap(gray);

Para convertir una imagen de intensidad de double a uint16, primero tiene que multiplicar por 65535:

I16 = uint16(round(I64*65535));

A la inversa, divida entre 65535 después de convertir una imagen de intensidad uint16 en double:

I64 = double(I16)/65535;

Imágenes RGB

Los componentes de color de una imagen RGB de 8 bits son enteros del rango [0, 255], en lugar de valores en punto flotante del rango [0, 1]. Un píxel cuyos componentes de color son (255,255,255) se muestra como blanco. El comando image muestra una imagen RGB correctamente si su clase es double, uint8 o uint16:

image(RGB);

Para convertir una imagen RGB de double a uint8, primero tiene que multiplicar 255:

RGB8 = uint8(round(RGB64*255));

A la inversa, divida entre 255 después de convertir una imagen RGB uint8 a double:

RGB64 = double(RGB8)/255

Para convertir una imagen RGB de double a uint16, primero tiene que multiplicar por 65535:

RGB16 = uint16(round(RGB64*65535));

A la inversa, divida entre 65535 después de convertir una imagen RGB uint16 a double:

RGB64 = double(RGB16)/65535;

Compatibilidad de las operaciones matemáticas con uint8 y uint16

Para utilizar las siguientes funciones de MATLAB con los datos de uint8 y uint16, primero tiene que convertir los datos al tipo double:

Por ejemplo, si X es una imagen uint8, asigne los datos al tipo double:

fft(double(X))

En estos casos, la salida siempre es double.

La función sum devuelve resultados del mismo tipo que su entrada, pero ofrece la opción de utilizar la doble precisión para los cálculos.

Matemáticas de enteros de MATLAB

Consulte Operaciones aritméticas en clases de enteros para obtener más información sobre cómo funcionan las funciones matemáticas con los tipos de datos que no son dobles.

La mayoría de funciones de Image Processing Toolbox™ admiten las entradas uint8 y uint16. Si planea realizar un procesamiento de imágenes sofisticado en los datos de uint8 o uint16, considere incluir la toolbox en el entorno informático de MATLAB.

Compatibilidad con otros arreglos de 8 bits y 16 bits

Puede realizar otras operaciones en los arreglos uint8 y uint16, por ejemplo:

  • Reestructurar, reordenar y concatenar arreglos mediante las funciones reshape, cat y permute y los operadores [] y '

  • Guardar y cargar arreglos uint8 y uint16 en archivos MAT mediante save y load. (Recuerde que si carga o guarda una imagen en formato de archivo gráfico, tiene que utilizar los comandos imread y imwrite).

  • Localizar los índices de los elementos distintos de cero en los arreglos uint8 y uint16 mediante find. Sin embargo, el arreglo que se devuelve siempre es de clase double.

  • Operaciones relacionales

Convertir una imagen RGB de 8 bits a escala de grises

Puede realizar operaciones aritméticas en los datos de enteros, lo que le permite convertir los tipos de imagen sin convertir primero la clase numérica de los datos de imagen.

Este ejemplo lee una imagen RGB de 8 bits en una variable de MATLAB y la convierte a una imagen de escala de grises:

rgb_img = imread('ngc6543a.jpg'); % Load the image
image(rgb_img) % Display the RGB image

axis image;

Color image displayed in axes

Nota

Esta imagen se ha creado con ayuda del Space Telescope Science Institute, dirigido por la Association of Universities for Research in Astronomy, Inc., del contrato de la NASA NAs5-26555, y se reproduce con permiso de AURA/STScI. Las variaciones digitales de las imágenes producidas por AURA/STScI se pueden obtener libres de derechos. Agradecimientos: J.P. Harrington y K.J. Orkowski (Universidad de Maryland), y NASA.

Calcule la luminosidad monocromática combinando los valores RGB de acuerdo con la norma NTSC, que aplica los coeficientes relacionados con la sensibilidad del ojo a los colores RGB:

I = .2989*rgb_img(:,:,1)...
	+.5870*rgb_img(:,:,2)...
	+.1140*rgb_img(:,:,3);

I es una imagen de intensidad con valores enteros que oscilan desde un mínimo de cero:

min(I(:))
ans =
	0

hasta un máximo de 255:

max(I(:))
ans = 
	255

Para mostrar la imagen, utilice un mapa de colores de escala de grises con 256 valores. Así se evita la necesidad de escalar la aplicación de datos al color, que es obligatoria si utiliza un mapa de colores de un tamaño diferente. Utilice la función imagesc en los casos en los que el mapa de colores no contenga una entrada para cada valor de datos.

Muestre ahora la imagen en una nueva figura mediante el mapa de colores gris:

figure; colormap(gray(256)); image(I);
axis image;

Color image displayed using a grayscale colormap appears gray

Información relacionada

Otros mapas de colores con un rango de colores que varía continuamente de oscuro a claro pueden producir imágenes útiles. Por ejemplo, pruebe colormap(summer(256)) para una vista de osciloscopio clásica. Consulte colormap para ver otras opciones.

La función brighten le permite aumentar o reducir las intensidades de los colores de un mapa de colores para compensar las diferencias de la pantalla del ordenador o para mejorar la visibilidad de las regiones tenues o brillantes de la imagen (en detrimento del extremo opuesto del rango).

Resumen de tipos de imágenes y clases numéricas

Esta tabla resume cómo se interpretan los elementos de la matriz de datos como colores de píxel, en función del tipo de imagen y la clase de datos.

Tipo de imagen

Datos double

Datos uint8 o uint16

Indexada

La imagen es un arreglo de enteros m por n del rango [1, p].

El mapa de colores es un arreglo de valores en punto flotante p por 3 del rango [0, 1].

La imagen es un arreglo de enteros m por n del rango [0, -1].

El mapa de colores es un arreglo de valores en punto flotante p por 3 del rango [0, 1].

De intensidad

La imagen es un arreglo de valores en punto flotante m por n que se escala de forma lineal para producir los índices del mapa de colores. El rango habitual de los valores es [0, 1].

El mapa de colores es un arreglo de valores en punto flotante p por 3 del rango [0, 1] y suele ser una escala de grises.

La imagen es un arreglo de enteros m por n que se escala de forma lineal para producir los índices del mapa de colores. El rango habitual de los valores es [0, 255] o [0, 65535].

El mapa de colores es un arreglo de valores en punto flotante p por 3 del rango [0, 1] y suele ser una escala de grises.

RGB (de color real)

La imagen es un arreglo de valores en punto flotante m por n por 3 del rango [0, 1].

La imagen es un arreglo de enteros m por n por 3 del rango [0, 255] o [0, 65.535].