Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Reducir el número de colores de una imagen

En sistemas con pantallas a color de 24 bits, las imágenes truecolor pueden mostrar hasta 16.777.216 (es decir, 224) colores. En sistemas con profundidades de bits de pantalla inferiores, las imágenes truecolor siguen mostrándose razonablemente bien porque utiliza automáticamente la aproximación del color y el tramado si es necesario.MATLAB® La aproximación de color es el proceso por el cual el software elige colores de reemplazo en caso de que no se puedan encontrar coincidencias directas.

Las imágenes indexadas, sin embargo, pueden causar problemas si tienen un gran número de colores. En general, debe limitar las imágenes indexadas a 256 colores por las siguientes razones:

  • En sistemas con pantalla de 8 bits, las imágenes indexadas con más de 256 colores tendrán que ser diredos o mapeados y, por lo tanto, podrían no mostrarse bien.

  • En algunas plataformas, los mapas de colores no pueden superar las 256 entradas.

  • Si una imagen indexada tiene más de 256 colores, no puede almacenar los datos de imagen en una matriz, pero generalmente utiliza una matriz de clase en su lugar, lo que hace que el tamaño de almacenamiento de la imagen sea mucho mayor (cada píxel utiliza 64 bits).MATLABuint8double

  • La mayoría de los formatos de archivo de imagen limitan las imágenes indexadas a 256 colores. Si escribe una imagen indizada con más de 256 colores (utilizando ) en un formato que no admite más de 256 colores, recibirá un error.imwrite

Los métodos para reducir el número de colores de una imagen incluyen:

Reducir los colores de la imagen de color verdadero mediante la aproximación de color

Para reducir el número de colores de una imagen, utilice la función.rgb2ind Esta función convierte una imagen truecolor en una imagen indexada, lo que reduce el número de colores del proceso. proporciona los siguientes métodos para aproximar los colores de la imagen original:rgb2ind

La calidad de la imagen resultante depende del método de aproximación que utilice, del rango de colores de la imagen de entrada y de si utiliza o no el tramado. Tenga en cuenta que los diferentes métodos funcionan mejor para diferentes imágenes. Consulte una descripción del tramado y cómo habilitarlo o deshabilitarlo.Reducir colores con tramado

Quantization

La reducción del número de colores de una imagen implica La función utiliza la cuantificación como parte de su algoritmo de reducción de color. admite dos métodos de cuantificación: y .Quantization.rgb2indrgb2indcuantificación uniformecuantificación mínima de varianza

Un término importante en las discusiones sobre la cuantificación de imágenes es .Cubo de color RGB El cubo de color RGB es una matriz tridimensional de todos los colores definidos para un tipo de datos determinado. Dado que las imágenes RGB en pueden ser de tipo , , o , existen tres posibles definiciones de cubo de color.MATLABuint8uint16double Por ejemplo, si una imagen RGB es de clase , se definen 256 valores para cada plano de color (rojo, azul y verde) y, en total, habrá 2uint824 (o 16.777.216) colores definidos por el cubo de color. Este cubo de color es el mismo para todas las imágenes RGB, independientemente de los colores que realmente utilicen.uint8

Los cubos , , y color tienen la misma gama de colores.uint8uint16double En otras palabras, el rojo más brillante de una imagen RGB aparece igual que el rojo más brillante de una imagen RGB.uint8double La diferencia es que el cubo de color RGB tiene muchos más tonos de rojo (y muchos más tonos de todos los colores).double La siguiente figura muestra un cubo de color RGB para una imagen.uint8

Cubo de color RGB para uint8 Imágenes

La cuantificación implica dividir el cubo de color RGB en un número de cuadros más pequeños y, a continuación, asignar todos los colores que se encuentran dentro de cada cuadro al valor de color en el cuadro de ese cuadro.Centro

La cuantificación uniforme y la cuantificación mínima de varianza difieren en el enfoque utilizado para dividir el cubo de color RGB. Con una cuantificación uniforme, el cubo de color se corta en cajas de igual tamaño (cubos más pequeños). Con la cuantificación de varianza mínima, el cubo de color se corta en cajas (no necesariamente cubos) de diferentes tamaños; los tamaños de las cajas dependen de cómo se distribuyen los colores en la imagen.

Cuantización uniforme.  Para realizar una cuantificación uniforme, llame y especifique un archivo .rgb2indTolerancia La tolerancia determina el tamaño de los cuadros con forma de cubo en los que se divide el cubo de color RGB. El rango permitido para un ajuste de tolerancia es [0,1]. Por ejemplo, si especifica una tolerancia de , los bordes de los cuadros son una décima parte de la longitud del cubo de color RGB y el número total máximo de cuadros es0.1

n = (floor(1/tol)+1)^3

Los siguientes comandos realizan una cuantificación uniforme con una tolerancia de 0,1.

RGB = imread('peppers.png'); [x,map] = rgb2ind(RGB, 0.1);

La figura siguiente ilustra la cuantificación uniforme de una imagen.uint8 Para mayor claridad, la figura muestra un segmento bidimensional (o plano de color) del cubo de color en el que el rojo-0 y el verde y el azul oscilan entre 0 y 255. Los valores de píxel reales se indican por los centros de las x.

Cuantización uniforme en un segmento del cubo de color RGB

Una vez dividido el cubo de color, se tiran todas las cajas vacías. Por lo tanto, solo se utiliza uno de los cuadros para producir un color para el mapa de colores. Como se muestra anteriormente, se puede predecir la longitud máxima de un mapa de colores creado por la cuantificación uniforme, pero el mapa de colores puede ser menor que la predicción porque elimina los colores que no aparecen en la imagen de entrada.rgb2ind

Cuantización de varianza mínima.  Para realizar una cuantificación de varianza mínima, llame y especifique el número máximo de colores en el mapa de colores de la imagen de salida.rgb2ind El número que especifique determina el número de cuadros en los que se divide el cubo de color RGB. Estos comandos utilizan la cuantificación de varianza mínima para crear una imagen indexada con 185 colores.

RGB = imread('peppers.png'); [X,map] = rgb2ind(RGB,185);

La cuantificación de varianza mínima funciona asociando píxeles en grupos en función de la varianza entre sus valores de píxel. Por ejemplo, un conjunto de píxeles azules puede agruparse porque tienen una pequeña varianza del píxel central del grupo.

En la cuantificación de varianza mínima, los cuadros que dividen el cubo de color varían en tamaño y no necesariamente rellenan el cubo de color. Si algunas áreas del cubo de color no tienen píxeles, no hay cuadros en estas áreas.

Mientras establece el número de cuadros, , que se utilizarán , la ubicación viene determinada por el algoritmo a medida que analiza los datos de color de la imagen.nrgb2ind Una vez que la imagen se divide en cuadros ubicados de forma óptima, los píxeles de cada cuadro se asignan al valor de píxel en el centro del cuadro, como en la cuantificación uniforme.n

El mapa de colores resultante suele tener el número de entradas que especifique. Esto se debe a que el cubo de color se divide para que cada región contenga al menos un color que aparezca en la imagen de entrada. Si la imagen de entrada utiliza menos colores que el número especificado, el mapa de colores de salida tendrá menos que colores y la imagen de salida contendrá todos los colores de la imagen de entrada.n

La figura siguiente muestra la misma rebanada bidimensional del cubo de color que se muestra en la figura anterior (que muestra la cuantificación uniforme). Se han creado once cuadros utilizando la cuantificación de varianza mínima.

Cuantización de varianza mínima en un segmento del cubo de color RGB

Para un número determinado de colores, la cuantificación mínima de varianza produce mejores resultados que la cuantificación uniforme, ya que tiene en cuenta los datos reales. La cuantificación de varianza mínima asigna más entradas de mapa de colores a colores que aparecen con frecuencia en la imagen de entrada. Asigna menos entradas a los colores que aparecen con poca frecuencia. Como resultado, la precisión de los colores es mayor que con la cuantificación uniforme. Por ejemplo, si la imagen de entrada tiene muchos tonos de verde y pocos tonos de rojo, habrá más verdes que rojos en el mapa de colores de salida. Tenga en cuenta que el cálculo para la cuantificación de varianza mínima tarda más que el de la cuantificación uniforme.

Asignación de mapas de colores

Si especifica un mapa de colores real que se va a utilizar, utiliza (en lugar de la cuantificación) para buscar los colores en el mapa de colores especificado que mejor coincidan con los colores de la imagen RGB.rgb2indmapeo de mapas de colores Este método es útil si necesita crear imágenes que utilizan un mapa de colores fijo. Por ejemplo, si desea mostrar varias imágenes indexadas en una pantalla de 8 bits, puede evitar problemas de color mapeándolos todos al mismo mapa de colores. La asignación de mapas de colores produce una buena aproximación si el mapa de colores especificado tiene colores similares a los de la imagen RGB. Si el mapa de colores no tiene colores similares a los de la imagen RGB, este método produce resultados deficientes.

En este ejemplo se ilustra la asignación de dos imágenes al mismo mapa de colores. El mapa de colores utilizado para las dos imágenes se crea sobre la marcha mediante la función , que crea un mapa de colores RGB que contiene el número de colores que especifique. ( siempre crea el mismo mapa de colores para un número determinado de colores.)MATLABcolorcubecolorcube Dado que el mapa de colores incluye colores en todo el cubo de color RGB, las imágenes de salida pueden aproximarrazonablemente las imágenes de entrada.

RGB1 = imread('autumn.tif'); RGB2 = imread('peppers.png'); X1 = rgb2ind(RGB1,colorcube(128)); X2 = rgb2ind(RGB2,colorcube(128));

Nota

La función también es útil para mostrar varias imágenes indexadas.imshow Para obtener más información, consulte la página de referencia de .Mostrar imágenes individualmente en la misma figuraimshow

Reducir los colores de la imagen indexada usando imapprox

Utilícelo cuando necesite reducir el número de colores de una imagen indexada. se basa y utiliza los mismos métodos de aproximación.imapproximapproxrgb2ind Esencialmente, primero llama para convertir la imagen al formato RGB y, a continuación, llama para devolver una nueva imagen indexada con menos colores.imapproxind2rgbrgb2ind

Por ejemplo, estos comandos crean una versión de la imagen con 64 colores, en lugar del 128 original.trees

load trees [Y,newmap] = imapprox(X,map,64); imshow(Y, newmap);

La calidad de la imagen resultante depende del método de aproximación que utilice, del rango de colores de la imagen de entrada y de si utiliza o no el tramado. Tenga en cuenta que los diferentes métodos funcionan mejor para diferentes imágenes. Consulte una descripción del tramado y cómo habilitarlo o deshabilitarlo.Reducir colores con tramado

Reducir colores con tramado

Cuando se utiliza o para reducir el número de colores de una imagen, la imagen resultante puede parecer inferior a la original, ya que algunos de los colores se pierden. y ambos funcionan para aumentar el número aparente de colores en la imagen de salida. cambia los colores de los píxeles de una vecindad para que el color medio de cada vecindad se aproxime al color RGB original.rgb2indimapproxrgb2indimapproxTramadoTramado

Para obtener un ejemplo de cómo funciona el tramado, considere una imagen que contiene un número de píxeles de color naranja oscuro para los que no hay coincidencia exacta en el mapa de colores. Para crear la apariencia de este tono de naranja, el tramado selecciona una combinación de colores del mapa de colores, que, tomados juntos como un grupo de seis píxeles, se aproximan al tono deseado de naranja. Desde la distancia, los píxeles parecen ser el tono correcto, pero si miras de cerca la imagen, puedes ver una mezcla de otros tonos. Para ilustrar el tramado, en el ejemplo siguiente se carga una imagen truecolor de 24 bits y, a continuación, se usa para crear una imagen indizada con solo ocho colores.rgb2ind El primer ejemplo no utiliza tramado, el segundo utiliza tramado.

Lea la imagen y muésela.

rgb = imread('onion.png');  imshow(rgb)

Cree una imagen indexada con ocho colores y sin tramado.

[X_no_dither,map] = rgb2ind(rgb,8,'nodither'); imshow(X_no_dither,map)

Cree una imagen indexada utilizando ocho colores con tramado. Observe que la imagen difundida tiene un mayor número de colores aparentes, pero tiene un aspecto algo difuso. La imagen producida sin tramado tiene menos colores aparentes, pero una resolución espacial mejorada en comparación con la imagen tramada. Un riesgo al hacer la reducción de color sin tramado es que la nueva imagen puede contener contornos falsos.

[X_dither,map] = rgb2ind(rgb,8,'dither'); imshow(X_dither,map)