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 uin
t8 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
ypermute
y los operadores[]
y'
Guardar y cargar arreglos
uint8
yuint16
en archivos MAT mediantesave
yload
. (Recuerde que si carga o guarda una imagen en formato de archivo gráfico, tiene que utilizar los comandosimread
yimwrite
).Localizar los índices de los elementos distintos de cero en los arreglos
uint8
yuint16
mediantefind
. Sin embargo, el arreglo que se devuelve siempre es de clasedouble
.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;
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;
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, p -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]. |