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.

Reduzca el número de colores en una imagen

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

Sin embargo, las imágenes indexadas 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 tramadas o mapeadas y, por lo tanto, podrían no mostrarse bien.

  • En algunas plataformas, los mapas de colores no pueden exceder 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 usa 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 usa 64 bits).MATLABuint8double

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

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

Reducir colores de imagen truecolor 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, reduciendo 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 para obtener una descripción del tramado y cómo habilitarlo o desactivarlo.Reducir colores mediante el tramado

Quantization

La reducción del número de colores de una imagen implica que la función utiliza la cuantización como parte de su algoritmo de reducción de color. admite dos métodos de cuantización: y.quantization.rgb2indrgb2induniform quantizationminimum variance quantization

Un término importante en las discusiones sobre la cuantificación de imágenes es.RGB color cube El cubo de color RGB es una matriz tridimensional de todos los colores que se definen 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 utilizan.uint8

Todos los cubos de color tienen el mismo rango de colores.uint8uint16double En otras palabras, el rojo más brillante en una imagen RGB aparece igual que el rojo más brillante en 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 En la siguiente ilustración se muestra un cubo de color RGB para una imagen.uint8

Cubo de color RGB para imágenes Uint8

La cuantizació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 caen dentro de cada cuadro al valor de color de ese cuadro.center

La cuantificación uniforme y la cuantización de varianza mínima difieren en el enfoque utilizado para dividir el cubo de color RGB. Con la cuantización uniforme, el cubo de color se corta en cajas de igual tamaño (cubos más pequeños). Con la cuantizació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.

La cuantización uniforme.  Para realizar una cuantización uniforme, llame y especifique un.rgb2indtolerance La tolerancia determina el tamaño de las cajas con forma de cubo en las que se divide el cubo de color RGB. El rango permitido para una configuración 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 comandos abajo realizan la cuantizació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 donde rojo = 0 y verde y azul oscilan entre 0 y 255. Los valores reales de píxel son denotados por los centros de la x.

La cuantización uniforme en una rebanada del cubo de color RGB

Después de dividir el cubo de color, se desechan todos los cuadros vacíos. Por lo tanto, sólo una de las casillas se utiliza para producir un color para el mapa de colores. Como se muestra anteriormente, la longitud máxima de un mapa de colores creado por la cuantificación uniforme se puede predecir, pero el color de mapa puede ser menor que la predicción porque quita los colores que no aparecen en la imagen de entrada.rgb2ind

Cuantificación de varianza mínima.  Para realizar la cuantización de varianza mínima, llame y especifique el número máximo de colores en el mapa de color de la imagen de salida.rgb2ind El número especificado determina el número de casillas en las que se divide el cubo de color RGB. Estos comandos utilizan la cuantizació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 mínima de desviaciones funciona asociando los 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 llenan el cubo de color. Si algunas áreas del cubo de color no tienen píxeles, no hay ninguna caja en estas áreas.

Mientras se establece el número de casillas, que se utilizarán por, el algoritmo determina la ubicación, ya que analiza los datos de color de la imagen.nrgb2ind Una vez que la imagen se divide en cuadros ubicados óptimamente, los píxeles dentro 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 que especifique, el mapa de colores de salida tendrá menos de color y la imagen de salida contendrá todos los colores de la imagen de entrada.n

La siguiente figura muestra el mismo segmento bidimensional del cubo de color, como se muestra en la figura anterior (demostrando una cuantificación uniforme). Se han creado once cajas utilizando la cuantización de varianza mínima.

Cuantización de varianza mínima en una rebanada del cubo de color RGB

Para un número determinado de colores, la cuantización mínima de la varianza produce mejores resultados que la cuantificación uniforme, ya que tiene en cuenta los datos reales. La cuantización de varianza mínima asigna más de las entradas de mapa de color a los 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 cuantización uniforme. Por ejemplo, si la imagen de entrada tiene muchos tonos de verde y pocos tonos de rojo, habrá más greens 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 cuantificación uniforme.

Asignación de mapa de colores

Si especifica un mapa de colores real para usar, utiliza (en lugar de cuantización) para buscar el color en el color de mapa especificado que mejor coincida con los colores de la imagen RGB.rgb2indcolormap mapping Este método es útil si necesita crear imágenes que usen 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 asignándolas todas al mismo mapa de colores. La asignación de mapa de colores genera una buena aproximación si el mapa de color especificado tiene un color similar al de la imagen RGB. Si el 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 que se utiliza para las dos imágenes se crea sobre la marcha mediante la función, que crea un color RGB que contiene el número de colores que especifique. (siempre crea el mismo color Map para un número dado de colores.)MATLABcolorcubecolorcube Dado que el colores incluye colores en todo el cubo de color RGB, las imágenes de salida pueden aproximarse razonablemente a 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 o la página de referencia para.Mostrar imágenes individualmente en la misma figuraimshow

Reduzca los colores de la imagen indexada con imapprox

Utilírela cuando necesite reducir el número de colores de una imagen indexada. se basa en 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 para obtener una descripción del tramado y cómo habilitarlo o desactivarlo.Reducir colores mediante el tramado

Reducir colores mediante el tramado

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

Para obtener un ejemplo de cómo funciona el tramado, considere una imagen que contiene un número de píxeles anaranjados oscuros 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 color, que, tomados en conjunto como un grupo de seis píxeles, aproximan el tono deseado de naranja. Desde una distancia, los píxeles parecen ser el tono correcto, pero si miras de cerca en la imagen, puedes ver una mezcla de otros tonos. Para ilustrar el tramado, en el ejemplo siguiente se carga una imagen de color verdadero de 24 bits y, a continuación, se utiliza para crear una imagen indexada con solo ocho colores.rgb2ind El primer ejemplo no utiliza tramado, el segundo usa tramado.

Leer la imagen y mostrarla.

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 con tramado tiene un mayor número de colores aparentes, pero es un poco borrosa. La imagen producida sin tramado tiene menos colores evidentes, pero una resolución espacial mejorada en comparación con la imagen tramada. Un riesgo en 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)