Ejemplos de ImageMagick -- Conceptos básicos de color y canales
- ¿Qué es el color?
- Espacio de color RGB
- Espacio de color CMY
- Espacio de color CMYK
- Corrección gamma
- Gamma de tu monitor
- Corrección del espacio de color sRGB
- Conflictos de nombres de color
- Separar imágenes de canal
- Canales en escala de grises a partir de espacios de color
- Otros métodos de separación de canales
- Combinar imágenes de canal RGB
- Combinar imágenes de canal no RGB
- Generar una rueda de color HSL
- Espacios de color perceptuales (Lab, Luv)
-
Reemplazar colores en una imagen (reemplazar colores específicos)
- Reemplazar un color en la imagen
- Relleno por inundación con Draw
- Operador de relleno por inundación
- Factor de difuminado, coincidencia de colores cercanos
- Distancia del factor de difuminado
- Factor de difuminado y colores transparentes
Las imágenes ráster, que es con lo que trabaja ImageMagick (en general), consisten básicamente en una matriz de puntos o píxeles de color individuales. Modificar los puntos individuales y cómo se representan es lo que veremos en esta sección. En la siguiente sección veremos una modificación global más general de los colores de una imagen en su conjunto.
¿Qué es el color?
Para entender realmente el color, necesitas saber exactamente qué es el color. En el mundo físico, el color es en realidad una ilusión. Vemos color porque nuestros ojos perciben el mundo físico de una forma muy especial y limitada. Básicamente, en nuestros ojos tenemos sensores especiales para el rojo, el verde, el azul, y un sensor menor, secundario, para la visión periférica y las condiciones de poca luz. Este último es la razón por la que de noche solo vemos colores grises.
Para más información consulta Wikipedia, Células cono; el gráfico de la derecha muestra la respuesta de un ojo humano típico a las distintas longitudes de onda de la luz. Debido a esto, solo percibimos el mundo en términos de longitudes de onda electromagnéticas rojas, verdes y azules, y por eso las imágenes y el procesamiento de imágenes giran generalmente en torno al rojo, el verde y el azul, o RGB. Sin embargo, no es tan sencillo como eso. Cada uno de nuestros sensores de color responde en realidad a un rango de longitudes de onda. Por ejemplo, cuando vemos una luz amarilla, en realidad percibimos la luz usando tanto los sensores rojos como los verdes. Si nuestros sensores de color fueran detectores estrictamente puros de rojo y verde, no veríamos ningún color amarillo. De hecho, los arcoíris mostrarían 'huecos'. Eso significa que un televisor o una pantalla de ordenador en realidad nos engaña para que veamos amarillo emitiendo la mezcla justa de luz roja y verde, en lugar de luz amarilla real. Nuestros sensores de color perciben la misma intensidad que percibirían con una luz amarilla pura, y como resultado vemos amarillo, aunque en realidad estamos viendo dos frecuencias de color diferentes. Simplemente no podemos distinguir entre un amarillo puro y una mezcla de luz roja y verde. De forma similar, los colores azul-rojo (púrpura) no existen realmente como una única longitud de onda específica, sino solo como una mezcla de al menos dos frecuencias de color, aunque, estrictamente hablando, el violeta es una frecuencia específica a la que sí reaccionamos, principalmente con el azul y muy ligeramente con los otros dos sensores. Ten en cuenta que en realidad tenemos un cuarto sensor de visión, pero no es de color, sino un detector de poca luz, que se usa para la visión nocturna, cuando los sensores cono ya no funcionan muy bien. Por eso la noche se ve monocromática y la luz de la luna es toda gris. Este sensor es probablemente también la razón por la que el espacio de color sRGB (ver más abajo) tiene un componente lineal extraño para los colores muy oscuros. NOTA AL MARGEN: otros animales tienen sensores distintos a los nuestros. Las abejas y la mayoría de los demás insectos tienen sensores para el ultravioleta, de modo que para ellos nuestras imágenes impresas, televisores y vallas publicitarias probablemente tendrían muy poco sentido. Lo más probable es que estas imágenes artificiales se parecieran más a una imagen de falso color bastante horrible que al color casi perfecto que los humanos somos engañados para ver. Algunos animales tienen 4 sensores de color, mientras que otros solo tienen uno (blanco y negro) o dos. Además, algunos animales perciben el movimiento mucho mejor que cualquier color específico. Un toro, por ejemplo, no puede ver el rojo, pero sí las longitudes de onda azul-violeta y verde, aunque una capa ondeante se mostraría como un destello de un color de 'movimiento'. Para un toro, el ciclo de actualización de 50/60 Hz de un monitor probablemente parecería un destello de 'movimiento' en lugar de cualquier imagen con sentido. Para más información consulta Wikipedia, Visión cromática y Wikipedia, Color.
Espacio de color RGB y canales
Así que el espacio de color RGB es en realidad una forma de representar imágenes usando tres valores: rojo, verde y azul, que nos engañan para hacernos creer que estamos viendo algo del mundo real. Las imágenes pueden almacenarse así como 3 matrices de valores, donde cada uno de los tres valores forma un único píxel, o punto de color, que se ha de mostrar. Cada una de las tres matrices de valores se conoce como un canal, que es simplemente una imagen en escala de grises que representa la cantidad de luz que se ha de generar para uno solo de nuestros sensores de color. Por ejemplo, aquí están los componentes rojo, verde y azul de la imagen de una rosa. ![[Salida de IM]](../static/img/images/rose.gif)
Rosa | | ![[Salida de IM]](../static/img/color_basics/separate_RGB_0.gif)
Rojo | ![[Salida de IM]](../static/img/color_basics/separate_RGB_1.gif)
Verde | ![[Salida de IM]](../static/img/color_basics/separate_RGB_2.gif)
Azul
---|---|---|---|---
Observa cómo la imagen del 'Rojo' es mucho más brillante para mostrar una rosa que los otros dos componentes de color. Pero las tres imágenes son brillantes en la zona blanca cerca de la parte inferior. RGB son colores aditivos Ahora bien, los colores rojo, verde y azul se denominan colores 'aditivos'. Es decir, los colores se suman entre sí para formar la imagen de color final. Esto se debe a que esos son los colores dominantes que nuestros ojos perciben, y combinándolos podemos generar de forma efectiva casi todos los colores que nuestros ojos pueden ver. Son aditivos en el sentido de que, empezando con negro, como un monitor en blanco, irías añadiendo luz roja, verde y azul para generar los colores apropiados de la imagen que vemos. La clave de esto es que partes del negro, o la ausencia de luz, y luego añades las cantidades adecuadas de rojo, verde y azul. También puedes obtener el mismo efecto iluminando con tres linternas con celofán rojo, verde y azul pegado en los extremos, en una habitación oscura. Cuando los tres colores brillan en el mismo punto, digamos sobre una pared blanca, vemos blanco. Es por cómo nuestros ojos perciben realmente estos colores 'primarios' por lo que las imágenes en color se expresan generalmente en términos de valores RGB, que también se denominan 'canales de color'.
Espacio de color CMY
Cuando imprimes tienes un problema diferente. Un trozo de papel no puede generar luz, solo reflejarla. Por eso necesitas empezar con una superficie que refleje toda la luz que incide sobre ella, en todas las direcciones. Es decir, lo que es una superficie blanca. Con suerte, la luz que refleja es en sí misma una luz blanca pura, ya sea del sol entrando por la ventana o generada por las luces de nuestras habitaciones con iluminación artificial. Ahora bien, para crear una imagen sobre ese papel necesitas aplicar tinta a esa superficie, que en realidad elimina longitudes de onda concretas de la luz. Como 'percibimos' los colores rojo, verde y azul, esos son los colores que queremos eliminar selectivamente de la luz que refleja ese trozo de papel blanco. En consecuencia, usamos una tinta cian para eliminar la luz roja, magenta para eliminar la luz verde y amarillo para eliminar la luz azul. La cantidad de tinta cian, magenta y amarilla necesaria para generar un color específico produce lo que se denomina espacio de color CMY. Aquí genero las máscaras de tinta necesarias para generar una imagen de rosa usando solo tintas cian, magenta y amarilla (suponiendo que las tintas son 'lineales') ![[Salida de IM]](../static/img/images/rose.gif)
Rosa | | ![[Salida de IM]](../static/img/color_basics/separate_CMY_0.gif)
Cian | ![[Salida de IM]](../static/img/color_basics/separate_CMY_1.gif)
Magenta | ![[Salida de IM]](../static/img/color_basics/separate_CMY_2.gif)
Amarillo
---|---|---|---|---
Es decir, cuanto más brillantes sean los valores de la máscara cian, más tinta cian se necesitará para eliminar más rojo. En otras palabras, una máscara cian es el negativo exacto de la cantidad de luz roja que queremos que el papel refleje. De hecho, las tres imágenes de canal anteriores son el negativo exacto de las que se generaron para el espacio de color RGB. Así que, en realidad, para convertir una imagen RGB en una imagen CMY todo lo que necesitas es Negar la imagen y luego declarar que la imagen está en espacio de color CMY. Como estamos eliminando selectivamente longitudes de onda, el cian, el magenta y el amarillo se conocen como 'colores sustractivos'.
Espacio de color CMYK
El principal problema de eliminar selectivamente longitudes de onda es que simplemente eliminar toda la luz roja, verde y azul, aplicando las tres tintas cian, magenta y amarilla, no elimina en realidad toda la luz que se refleja. Como resultado, no te quedará un color negro, sino un horrible color marrón fangoso. Las tintas (o filtros de luz) no son perfectas, igual que nuestros propios ojos no son perfectos. Como mencioné antes, cada uno de nuestros sensores de color no ve solo una longitud de onda de luz, sino un rango de longitudes de onda que interpretamos como 'rojo', 'verde' o 'azul' (o una mezcla de esos colores). Tanto es así que nuestro sensor de luz 'azul' puede de hecho ver (aunque no muy bien) un poco de ultravioleta. NOTA AL MARGEN: el filtro de una 'luz negra' es deliberadamente imperfecto, para que podamos 'apenas ver' la luz de una lámpara así, y saber si está encendida o no. Es debido a esta 'fuga' de color de las tintas CMY, y a nuestros propios ojos imperfectos, por lo que también añadimos una tinta negra pura a la mezcla, lo que permite usarla para eliminar TODA la luz que pudiera reflejarse del papel. Para evitar confundirlo con el azul (blue), a la tinta o canal negro se le asigna la letra K. Así, para imprimir usamos cuatro tintas de color: cian (Cyan), magenta (Magenta), amarillo (Yellow) y negro (blacK); y definimos las imágenes usando estas tintas, para formar un espacio de color CMYK. Por ejemplo, aquí están los componentes CMYK apropiados separados de esta imagen. ![[Salida de IM]](../static/img/images/rose.gif)
Rosa | | ![[Salida de IM]](../static/img/color_basics/separate_CMYK_0.gif)
Cian | ![[Salida de IM]](../static/img/color_basics/separate_CMYK_1.gif)
Magenta | ![[Salida de IM]](../static/img/color_basics/separate_CMYK_2.gif)
Amarillo | ![[Salida de IM]](../static/img/color_basics/separate_CMYK_3.gif)
Negro
---|---|---|---|---|---
Observa cómo la cantidad de cian, magenta y amarillo se ha reducido y ahora es más oscura que en el espacio de color CMY, ya que su uso fue sustituido por una cantidad apropiada de negro. Es decir, cuando las tres tintas están presentes para un píxel concreto, se usa negro en su lugar. Así, para imprimir negro puro, solo usas tinta negra pura, y ninguna otra tinta. Recuerda que el 'negro' (blacK) anterior es la cantidad de tinta negra que se ha de aplicar a un trozo de papel, así que cuanto más brillante sea la imagen del canal en escala de grises, más tinta negra se deberá usar. Por eso también es una imagen de aspecto negativo, igual que las otras tres imágenes. Por supuesto, añadir un negro puro en una impresora de color hace que imprimir texto negro sea mucho más sencillo, ya que ya no necesitas imprimir tres tintas diferentes, superpuestas perfectamente en el mismo punto, para generar líneas, letras y formas de negro puro. Esto significa mucha menos tinta, con el papel quedando menos 'húmedo' y con menos probabilidad de correrse o emborronarse, lo cual es especialmente bueno para las impresoras. Para otra discusión similar de cómo funcionan los colores RGB y CMYK, consulta la página de introducción de XaraXone Workbook, Defining Color.
Otros espacios de color
Otros espacios de color son simplemente otras formas de representar esos mismos colores, o algunos de los que están más allá del RGB estricto que nuestros ojos imperfectos también pueden distinguir. Sin embargo, tales espacios de color tienen poca relevancia ni para mostrar esos colores en un monitor ni para imprimir. Básicamente representan otras formas de manejar o procesar los colores de una imagen, de modo que se realcen o destaquen cosas específicas como...
- Mejor manejo no lineal de los colores oscuros (sRGB)
- Arcoíris de color y tonos (espacios de color HSB, HSL, HSI, OTHA — la intensidad no se conserva)
- Colores de definición estandarizada (XYZ)
- Diferencias de color precisas o perceptuales (espacios de color LAB y LUV, y sus equivalentes de tono cíclico LCHab y LCHuv)
- Rangos dinámicos altos ampliados (para usar con imágenes HDRI) (scRGB)
- Mejor compresión de los valores de color (como en YIQ y YUV)
- Transmisión para televisores (YCbCr, YPbPr, donde Y = señal en blanco y negro)
Un último espacio de color que aún no he mencionado es la 'Escala de grises', pero ese es simplemente una sencilla matriz única de valores de píxel. Cómo se interpretan estos valores es variable, ya que podrían representar muchas cosas distintas. Normalmente se considera que una imagen así es de escala de grises lineal y similar al RGB lineal (en contraposición al sRGB no lineal). La versión 6 de IM en realidad no tiene tal espacio de color de escala de grises, y solo lo simula con el espacio de color RGB lineal, estableciendo todos los ajustes RGB al mismo valor. Si los tres valores no son iguales, la imagen ya no es de escala de grises. En la versión 7 de IM, la escala de grises es una imagen de un solo canal (uso de memoria mucho menor). | _Los cambios anteriores en el 'espacio de color' de una imagen son solo una reorganización general de los colores de una imagen en memoria. También proporcionan conversiones de color muy básicas (simplistas) entre distintos espacios de color.
Para especificaciones y conversiones de color exactas, deberían usarse en su lugar los perfiles de color, pero esto solo funciona cuando se usan formatos de archivo de imagen que puedan manejar perfiles de color.
_
---|---
Corrección gamma y espacio de color sRGB
Percepción humana del color
En lo anterior vimos que puedes representar imágenes de muchas formas distintas. Todos los espacios de color que vimos arriba se conocen como espacios de color 'lineales', lo que significa que el valor real usado representa los valores reales de 'intensidad' del color de una imagen. Sin embargo, la vida real nunca es tan simple. ¡Nunca lo es! Por ejemplo, generemos y guardemos una imagen con una sencilla secuencia lineal de valores de gris... |
magick -size 100x100 gradient:'gray(100%)-gray(0)' \
-set colorspace sRGB gradient.gif
- El uso de "
gradient:'gray(100%)-gray(0)'" garantiza que IM genere un gradiente de datos RGB lineales, que estará en el espacio de color RGB lineal. - El "-set colorspace sRGB" le indica a IM que este gradiente 'lineal' está en realidad en "sRGB" y que, por tanto, no necesita 'corrección' al guardarlo en un formato de archivo GIF, que solo puede almacenar valores en espacio de color sRGB.
Ahora bien, los valores de color reales usados en esta imagen son un gradiente lineal que debería cambiar suavemente de blanco en la parte superior a negro en la inferior, con un gris perfecto, matemáticamente exacto al 50% en el medio. Sin embargo, si miras la imagen verás que en realidad parece contener muchos más colores oscuros (casi negros) que claros (casi blancos). ¿Por qué? Pues bien, la visión humana, cuando recibe una intensidad de luz que es solo la mitad de su rango máximo ('blanco'), no ve el gris medio puro que indica el valor de color, sino un color mucho más oscuro. Como resultado, el gradiente lineal anterior no parece una distribución lineal uniforme de colores de blanco a negro, sino que tiene muchos más colores oscuros de los que debería. La relación entre el valor real de la imagen y el valor percibido es aproximadamente una 'función potencia' de la forma...
**_gris_percibido_ = _valor_ 2.2**
El valor '2.2' es el valor medio de la función gamma, típico de la mayoría de los seres humanos.
Corrección gamma
La corrección gamma es una forma de ajustar los valores de color que realmente se guardan, de modo que la imagen final parezca mucho más uniforme en su distribución de colores. Básicamente, mientras que la visión humana hace que la luz parezca más oscura usando un factor de potencia de 2.2, para hacer que una imagen lineal 'parezca' lineal necesitamos invertir esa función potencia, usando un valor de 1/2.2. Es decir, para hacer que una imagen parezca lineal, necesitamos corregirla usando la siguiente fórmula...
**_valor_corregido_por_gamma_ = _valor_ 1/2.2**
IM proporciona corrección gamma ya sea mediante el operador Level, argumento Gamma, o más concretamente usando el operador Gamma. Sin embargo, también podrías modificar directamente los valores de la imagen usando la función POW de Evaluate.
Así que apliquémoslo y veamos el resultado de una 'imagen corregida por gamma'... |
magick -size 100x100 gradient:'gray(100%)-gray(0)' -gamma 2.2 \
-set colorspace sRGB gradient_gamma.gif
![[Salida de IM]](../static/img/color_basics/gradient_gamma.gif)
Observa cómo la imagen tiene ahora cantidades mucho más equilibradas de colores claros y oscuros. Sin embargo, los valores reales dentro de la imagen ya no son 'lineales', lo que puede causar problemas al procesar esta imagen más adelante. La corrección gamma es solo un método 'rápido' y aproximado de ajustar los colores para hacer que una imagen 'parezca' correcta. No es el método habitual ni siquiera el mejor para corregir una imagen para la respuesta humana. Para ejemplos más concretos de corrección gamma en el procesamiento de imágenes, consulta Redimensionar con corrección gamma. Para más información sobre la corrección gamma, consulta
- Corrección gamma (Wikipedia)
- Error de gamma en el escalado de imágenes (incluye una sección sobre el uso de IM)
- FAQ de Gamma, procesamiento de imágenes
Quizás también quieras echar un vistazo al operador "[-auto-gamma](https://imagemagick.org/command-line-options/#auto-gamma)", que intenta ajustar la gamma para producir una imagen RGB lineal, con cantidades iguales de claro y oscuro (en el espacio lineal).
Gamma de tu monitor
Aléjate de tu monitor unos pocos metros y mira la imagen de la izquierda. Si tu monitor (y navegador web) está mostrando correctamente la imagen sRGB, el punto donde el patrón central 'de tramado' tiene aproximadamente el mismo brillo que el gradiente sRGB que lo rodea debería estar justo en el centro. ¡La mayoría de los monitores de ordenador fallan esta prueba! Sin embargo, los televisores HDMI deberían salir perfectos. La imagen se creó usando... |
magick -size 45x256 gradient: -size 10x256 pattern:gray50 \
-duplicate 1,0 +append -set colorspace sRGB -colorspace RGB \
monitor_sRGB.png
![[Salida de IM]](../static/img/color_basics/monitor_sRGB.png)
Aquí hay algunas imágenes similares con distintos niveles de 'gamma' para que puedas ver cuán cerca está tu monitor de una visualización gamma '2.2' correcta para la percepción humana.
for gamma in 1.6 1.8 2.0 2.2 2.4
do
magick -size 45x256 gradient: -size 10x256 pattern:gray50 \
-duplicate 1,0 +append -gamma $gamma monitor_g$gamma.png
done
![[Salida de IM]](../static/img/color_basics/monitor_g1.6.png)
Gamma 1.6 | ![[Salida de IM]](../static/img/color_basics/monitor_g1.8.png)
Gamma 1.8 | ![[Salida de IM]](../static/img/color_basics/monitor_g2.0.png)
Gamma 2.0 | ![[Salida de IM]](../static/img/color_basics/monitor_g2.0.png)
Gamma 2.2 | ![[Salida de IM]](../static/img/color_basics/monitor_g2.4.png)
Gamma 2.4
---|---|---|---|---
La imagen en la que (cuando te alejas) el punto de igual brillo está aproximadamente en la marca del 50% te indica el nivel de gamma aproximado de tu monitor. Si está bien calibrado, tu monitor debería tener un nivel de gamma de 2.2, que coincide muy de cerca con el del espacio de color sRGB. Cuando escribí esto, mi antigua pantalla (proporcionada por el trabajo) era extremadamente mala. Tenía un ajuste de gamma de aproximadamente 1.8, y en realidad tenía una gamma diferente en la parte superior de la pantalla (más oscura) que en la parte inferior (más clara). Algo que me ha causado problemas al comparar imágenes en distintas ubicaciones de la pantalla, ya que la misma imagen se ve diferente al colocarla en distintas posiciones verticales. Por otro lado, mi portátil personal (en aquella época) tenía una pantalla muy uniforme, con un ajuste de gamma razonable de 2.0 según lo anterior.
Corrección del espacio de color sRGB
Guardar una imagen usando un espacio de color sRGB es muy similar a aplicar corrección gamma a una imagen, pero es algo más complicado, de modo que reproduce mejor la respuesta real del ojo humano, específicamente con los tonos de color muy oscuros. Así que guardemos nuestro gradiente lineal en un espacio de color corregido por sRGB. |
magick -size 100x100 gradient:'gray(100%)-gray(0)' \
-set colorspace RGB -colorspace sRGB gradient_sRGB.gif
![[Salida de IM]](../static/img/color_basics/gradient_sRGB.gif)
| A partir de IM v6.7.7 lo anterior se simplifica a simplemente |
magick -size 100x100 gradient:white-black gradient_sRGB.gif
_Esto se debe a que el gradiente lineal siempre se generará en un espacio de color lineal (RGB) (que es la única forma sensata en que el operador puede funcionar).
Sin embargo, como se están solicitando colores sRGB 'white-black', el gradiente de datos lineales se convertirá automáticamente al espacio de color sRGB, produciendo valores de datos no lineales y un gradiente perceptualmente lineal.
| _Antes de la versión 6.7.5 de IM, lo anterior habría fallado, ya que IM tenía invertidos los significados de los espacios de color 'sRGB' y 'RGB'. Por eso, en versiones más antiguas de IM, los dos nombres de espacio de color debían intercambiarse. Por ejemplo... |
magick -size 100x100 gradient: -set colorspace sRGB \
-colorspace RGB gradient_sRGB.gif
_Esta rareza en el manejo del espacio de color se consideró durante mucho tiempo un error de IMv7, aunque estaba previsto que se corrigiera solo en IMv7, se retroportó a IMv7.
Ten en cuenta que lo anterior (o cualquier otro gradiente) no es perfecto, ya que la perfección es simplemente imposible; cada persona ve las cosas a su manera con ligeras diferencias. Dicho de forma simple: _lo que tú ves nunca es exactamente lo que ven otras personas (en realidad es muy Zen). Todo lo que es sRGB es una muy buena aproximación para la mayoría de la gente, según numerosos estudios, y muchos expertos en impresión/pintura/color. Para más detalles de la fórmula exacta de sRGB, consulta Wikipedia, Espacio de color sRGB. Se desarrolló una 'respuesta de luminancia humana' más completa y precisa, que puede verse en línea en la tesis Visión humana, diferencia apenas perceptible. Esta incluye la respuesta adaptativa en situaciones de grandes cambios de iluminación. La World Wide Web se ha estandarizado en el uso de sRGB como el espacio de color predeterminado recomendado (y aún razonablemente simple), y debería usarse, por tanto, para todas las imágenes que no contengan información de perfil de espacio de color. Es decir, para imágenes como GIF, PNG, JPEG y TIFF. Todos estos formatos (excepto GIF) permiten el uso de perfiles de color para especificar definitivamente el espacio de color de la imagen. Sin embargo, formatos de archivo de imagen como PbmPlus no se consideran normalmente que estén en espacio de color sRGB. Por eso, al trabajar con tales formatos de archivo, suele ser buena idea usar "-set colorspace ..." para garantizar que el espacio de color es el que esperas. Y aquí están las tres imágenes juntas para que puedas compararlas. ![[Salida de IM]](../static/img/color_basics/gradient.gif)
Lineal | ![[Salida de IM]](../static/img/color_basics/gradient_gamma.gif)
Gamma | ![[Salida de IM]](../static/img/color_basics/gradient_sRGB.gif)
sRGB
---|---|---
Como puedes ver, las imágenes corregidas por gamma y por sRGB son casi idénticas, y la diferencia, cuando se representa gráficamente, es en realidad extremadamente pequeña. Por eso, aunque usar sRGB es el método más correcto, usar la corrección gamma es probablemente más fácil de aplicar. Las mayores diferencias entre una imagen sRGB y una gamma están en las imágenes extremadamente oscuras. Para un valor de gris de 8 bits de 1, sRGB es 60 veces más brillante que la gamma equivalente. Un valor de 8 es 5 veces más brillante. Esto no supondrá ninguna diferencia perceptible en la mayoría de los casos, pero puede suponerla cuando se maneja una imagen muy oscura.
Procesamiento de imágenes reales
A la mayoría de los operadores de procesamiento de imágenes no les importa qué espacio de color usa una imagen; simplemente aplican sus operaciones a los datos del canal independientemente de su espacio de color. Aunque algunos tienen que hacer un esfuerzo especial para manejar los datos de canal adicionales del 'Negro', y, como verás más adelante, del 'Alfa' (o transparencia 'Alfa'). Sin embargo, el espacio de color de una imagen puede influir enormemente en el resultado final de muchas operaciones. Por eso, hacer el procesamiento de imágenes en un espacio de color diferente puede generar mejores resultados. Este ejemplo muestra con más claridad por qué procesar en sRGB no es una buena idea. De una discusión sobre Desenfoques de color y 'Colores rotos', en el foro de usuarios de IM. Tomamos dos colores usando distintos canales de color y los desenfocamos juntos de modo que dentro del canal el color se desenfoque hasta cero (un valor de color bajo). Primero hagámoslo usando el canal de entrada sRGB predeterminado. |
magick -size 40x80 xc:red xc:lime +append \
-blur 0x20 blur_sRGB.png
![[Salida de IM]](../static/img/color_basics/blur_sRGB.png)
Si observas los resultados, parece que los colores se desenfocan del rojo pasando por el negro y luego al verde. Es decir, porque los valores parecen a nuestros ojos más oscuros de lo que deberían ser en el espacio de color sRGB. Aquí desenfoco la misma imagen de nuevo pero usando un espacio de color RGB lineal. |
magick -size 40x80 xc:red xc:lime +append \
-colorspace RGB -blur 0x20 -colorspace sRGB blur_RGB.png
![[Salida de IM]](../static/img/color_basics/blur_RGB.png)
Como puedes ver, esta vez obtenemos un resultado mucho más sensato, con los colores rojo y verde desenfocándose pasando por el naranja. También obtienes resultados similares usando otros espacios de color lineales como LAB o LUV, que veremos con más detalle más abajo. Básicamente, al procesar imágenes que implican mezclar colores, por ejemplo en operaciones como la cuantización de color (reducción de color), pero también en el redimensionado de imágenes y, más en general, en la distorsión de imágenes, deberías procesar las imágenes en un espacio de color lineal para obtener los resultados más precisos, aunque en realidad poca gente hace esto. | _Helmut Dersch (conocido por la distorsión de barril y la corrección de lentes) recomienda que consideres usar el espacio de color lineal 'LAB' para procesar imágenes, especialmente para el redimensionado y las distorsiones de imagen.
Yo solo recomiendo que pases del espacio de color de 'entrada' sRGB a algún otro espacio de color 'lineal' cuando hagas dibujos, composiciones, redimensionado o distorsiones de imágenes. Si es RGB lineal, LAB o LUV no debería importar demasiado.
_
---|---
Aquí, por ejemplo, hay desenfoques rojo-azul en los 3 principales espacios de color lineales. Elegí estos colores porque parecen mostrar la mayor diferencia en los colores intermedios generados.
for colorspace in RGB LUV LAB
do
magick -size 80x40 xc:red xc:blue -append \
-colorspace $colorspace -blur 0x30 -colorspace sRGB \
colorspace_$colorspace.png
done
Para más ejemplos de procesamiento de imágenes con respecto al espacio de color, consulta Redimensionar con corrección de espacio de color. Consulta también las advertencias sobre los nombres de color y el dibujo en espacio de color lineal, en Dibujar con corrección de gamma y espacio de color
Especificación de color
Los colores en IM pueden especificarse de muchas formas. La mejor guía sobre esto está en el sitio web oficial de IM Color Names.
Colores por nombre
A muchos colores se les ha dado nombres específicos, que hacen que sean más fáciles de usar. Por ejemplo, "RoyalBlue" es un color azul ligeramente desaturado muy bonito y brillante.
A la derecha hay una imagen que contiene todos los colores con nombre, incluidos los que tienen números, disponibles en ImageMagick. Los colores se ordenaron primero en 3 grupos: blancos rotos, tonos medios y colores oscuros, y luego se representaron en tres ruedas de color HSL distintas, cada una con un desplazamiento vertical diferente. El blanco puro y el negro puro aparecen como sus propios puntos separados en la parte superior e inferior del gráfico, para formar los extremos del rango vertical. El script que lo generó es "[hsl_named_colors](../static/img/scripts/hsl_named_colors)" y sigue una técnica vista en Posicionamiento programado de imágenes en capas. | _Técnicamente, como dibujo los colores HSL en la forma tridimensional de un 'bicono' en lugar de un 'cilindro', el radio de cada punto de color se ha fijado igual al 'croma' del color ('saturación'/'brillo'), en lugar de solo su 'saturación'. Consulta Wikipedia: HSL y HSV.
Para ser aún más correcto, también deberían haberse usado pirámides hexagonales en lugar de conos, aunque eso es mucho más difícil de calcular, para poca ganancia.
_
---|---
Como puedes ver, hay muchos nombres de color asociados al rango del rojo al amarillo y un grupo más pequeño en los tonos del cian al verde. Con un grupo similar en los amarillos y cianes de blanco roto. Pero hay poco en cuanto a colores verde roto con nombre. Esencialmente, hay algunas zonas del espacio de color HSL que tienen muy pocos colores con nombre. Puede ser difícil encontrar un color con nombre específico para usar. Pero al cargar la imagen de la derecha en el programa "[display](basics.html#display)" de IM puedes usar el botón central del ratón para ver el nombre de color de ImageMagick del color específico que se ha representado.
Nombres de color especiales
Hay algunos colores especiales que se usan para fines especiales dentro de ImageMagick. 'None' o 'Transparent' es un color negro completamente transparente, y se usa generalmente para especificar la transparencia del fondo, como al crear un lienzo de color sólido, o al usar capas de imagen. 'Opaque' es simplemente un alias de 'Black', y por eso rara vez se usa. Normalmente solo se usa cuando se quiere indicar CUALQUIER color opaco, como al hacer procesamiento del canal alfa.
Conflictos de nombres de color
Los nombres de color pueden provenir de tres fuentes distintas, SVG, X11 y XPM, y la mayoría de los nombres producen el mismo color independientemente de la fuente que lo define. Pero hay unos pocos nombres de color que producen colores diferentes, según la especificación de color que se use. El mayor problema es el color SVG 'Green' (verde a medio brillo), que es diferente del color X11/XPM 'Green' (verde RGB puro). Si quieres un verde puro, es mejor usar el nombre de color SVG 'Lime', que no tiene conflicto. Wikipedia tiene un artículo excelente sobre los conflictos de nombres de color, así como una buena tabla de los nombres de color reales, en Nombres de color X11. Quizás también quieras echar un vistazo al artículo Colores web, que proporciona un conjunto de tablas bien ordenadas de algunos rangos de color. Los conflictos más destacados están en cuatro colores específicos. Aquí hay una tabla de los conflictos de nombres de color conocidos. Recuerda que el color SVG es el que IM usará de forma predeterminada. Conflicto
Nombre de color | Resultado SVG
(predeterminado de IM) | Resultado X11
para el nombre | Nombre X11
equivalente | Nombre de color
alternativo
---|---|---|---|---
Green | | #008000 | | #00FF00 | | | Lime
Maroon | | #800000 | | #B03060 | | FireBrick |
Purple | | #FF00FF | | #A020F0 | | Magenta |
Gray | | #7E7E7E | | #BEBEBE | | | Grey
Notas sobre lo anterior...
- El '
Grey' de X11 es un color gris medio visual. También es muy cercano (pero no exactamente igual) al color X11 'Gray74' y al color SVG 'Silver' ('gray(192)'). - El '
Gray' predeterminado (SVG) es muy cercano a un gris matemáticamente perfecto, que se especifica mejor usando los nombres de color 'Gray50' o 'gray(128)' (para uso de 8 bits). - Como todos los colores con nombre se especifican usando valores de 8 bits (0-255), ¡ninguno de ellos generará un color gris puro de 16 bits perfecto!
- Cuando se necesita un gris para procesamiento matemático, como FFT DC Phase, detección de bordes, imágenes de sombreado, efectos de iluminación de composición y mapas de desplazamiento relativo, es mucho mejor que uses la fórmula de color '
gray(50%)', que sí genera un gris medio matemáticamente perfecto a cualquier profundidad de bits de color.
Se recomienda precaución al seleccionar un color para un fin específico.
Colores y espacio de color
Aunque muchos colores tienen nombres, la mayoría de los colores que se encuentran en las imágenes no los tienen; son simplemente un conjunto de valores, normalmente 3, que especifican un color concreto. Sin embargo, tres valores por sí solos no definen completamente un color; también necesitas especificar el 'espacio de color' o 'sistema de color' al que pertenecen esos valores. Todos los colores 'con nombre' anteriores están en espacio de color sRGB, que es el espacio de color en el que se definieron. Pero a veces quieres definir un color en un espacio de color diferente. Por ejemplo, en HSL, o CYMK, o incluso como un color XYZ. ImageMagick puede hacer esto y puedes ver los detalles de estas especificaciones en ImageMagick Color Names. Futuro: ejemplos de uso de otros espacios de color (todavía en desarrollo) | _Aunque RGB en ImageMagick representa un espacio de color RGB lineal, es una práctica aceptada que un nombre de color de 'rgb(value,value,value)' esté en realidad definiendo un color sRGB.
Para definir realmente un color RGB lineal en lugar de un color sRGB, usa la fórmula de color 'icc-color(RGB,value,value,value)' (ver a continuación).
---|---
A partir de IM v6.7.8-3, puedes usar la función 'icc-color(colorspace,color...)' para definir un color, o redefinir el espacio de color, de un color específico. _Futuro: ejemplos de uso
Colores semitransparentes
Puedes especificar directamente colores semitransparentes solo de dos formas distintas. El método más común para establecer un color semitransparente es usar un valor hexadecimal. Por ejemplo, aquí hay algunas especificaciones de color que muestran varios niveles de transparencia de color. He mostrado las imágenes de color generadas sobre un patrón de fondo para que puedas ver ese patrón a través de la transparencia de la imagen.
magick -size 50x50 xc:'#00FF00FF' color_hex_1.png
magick -size 50x50 xc:'#00FF00C0' color_hex_2.png
magick -size 50x50 xc:'#00FF0090' color_hex_3.png
magick -size 50x50 xc:'#00FF0060' color_hex_4.png
magick -size 50x50 xc:'#00FF0030' color_hex_5.png
magick -size 50x50 xc:'#00FF0000' color_hex_6.png
| Antes de IM v6.3.0, el último conjunto de dígitos hexadecimales contenía la transparencia del color en forma de un valor de 'mate' u 'opacidad'. Es decir, el '00' hexadecimal final representaba 'opaco' y 'FF' era transparente.
Sin embargo, después de IM v6.3.0, este valor se invirtió de modo que representara un valor de transparencia 'alfa', para alinear IM con los estándares SVG y otros paquetes gráficos. En otras palabras, 'FF' ahora representa completamente opaco y '00' es completamente transparente.
---|---
También puedes especificar colores usando la función de color especial 'rgba()'. Donde los valores RGB van de 0 a 255, y el canal alfa se especifica como una fracción decimal entre 0.0 (transparente) y 1.0 (opaco).
magick -size 50x50 xc:'rgba(255,0,0, 1.0)' color_rgba_1.png
magick -size 50x50 xc:'rgba(255,0,0, 0.8)' color_rgba_2.png
magick -size 50x50 xc:'rgba(255,0,0, 0.6)' color_rgba_3.png
magick -size 50x50 xc:'rgba(255,0,0, 0.4)' color_rgba_4.png
magick -size 50x50 xc:'rgba(255,0,0, 0.2)' color_rgba_5.png
magick -size 50x50 xc:'rgba(255,0,0, 0.0)' color_rgba_6.png
| Antes de la versión 6.2.7 de IM, 'rgba()' también usaba un valor de mate para el valor del canal alfa. Es decir, un valor de 0 para completamente opaco y 255 para completamente transparente. Esto se cambió según lo definido por la "recomendación del módulo de color CSS3 del W3C para especificar colores", como parte de que IM se volviera más conforme con otros estándares de imagen, en particular para uso en la WWW y SVG.
---|---
Actualmente es imposible especificar directamente un color semitransparente por su nombre, con un valor de alfa adicional. Sin embargo, puedes apañarlo generando ese color con nombre y luego modificando la transparencia de la imagen. También tienes la complicación añadida de que debes establecer el canal alfa, antes de poder establecer realmente la transparencia del color.
magick -size 50x50 xc:RoyalBlue color_name_1.png
magick -size 50x50 xc:RoyalBlue -alpha set \
-channel A -evaluate set 80% color_name_2.png
magick -size 50x50 xc:RoyalBlue -alpha set \
-channel A -evaluate set 60% color_name_3.png
magick -size 50x50 xc:RoyalBlue -alpha set \
-channel A -evaluate set 40% color_name_4.png
magick -size 50x50 xc:RoyalBlue -alpha set \
-channel A -evaluate set 20% color_name_5.png
magick -size 50x50 xc:RoyalBlue -alpha set \
-channel A -evaluate set 0 color_name_6.png
Sí, esto es un fastidio, y sería bonito que la transparencia pudiera establecerse como parte de la especificación del nombre del color. Si te gustaría ver esto, haz una petición en el foro de desarrolladores de IM. También es posible dibujar un color de relleno con nombre usando los ajustes de dibujo MVG, aunque necesitarás un lienzo de partida transparente para que esto funcione correctamente. Por ejemplo... |
magick -size 50x50 xc:none \
-draw "fill Tomato fill-opacity 0.5 rectangle 0,0 49,49" \
color_name_draw.png
| ![[Salida de IM]](../static/img/color_basics/color_name_draw.png)
| Ten en cuenta que un color completamente transparente, aunque sea completamente invisible, sigue teniendo un color. Sin embargo, la mayoría de los operadores de IM reconocen que cualquier color que sea completamente transparente es lo mismo que cualquier otro color completamente transparente. Debido a esto y a cómo funcionan las matemáticas internas, muchos operadores a menudo reemplazarán un color completamente transparente por negro completamente transparente (también conocido como el color especial 'none').
---|---
Canales de color
Los datos de color reales de una imagen se almacenan como matrices de valores, conocidas como canales. Normalmente una imagen tendrá al menos 3 canales, que representan los valores de color rojo, verde y azul. Pero, como viste antes, los valores almacenados podrían representar otros espacios de color.
Espacio de color y nomenclatura de canales
El propósito principal del operador "[-colorspace](https://imagemagick.org/command-line-options/#colorspace)" es cambiar la forma en que IM almacena los colores de una imagen en memoria. Normalmente cada imagen tiene 3 (o 4) canales de datos de imagen. El 'espacio de color' actual de una imagen determina lo que representan los datos de cada canal. Ahora bien, normalmente los canales se denominan 'Rojo', 'Verde', 'Azul', ya que ese es normalmente el tipo de datos de imagen que se almacena en esos canales. Sin embargo, no siempre es así. No pienses en el canal 'R' o 'Rojo' como rojo, piénsalo como el 'canal 1', que podría contener datos de 'rojo', 'tono', 'cian' u otras cosas según el espacio de color de la imagen. 'Rojo' es solo una etiqueta para el canal que normalmente se usa para el 'rojo', o el primer canal. El segundo espacio de color más usado es 'CMYK', que define la cantidad de 'tinta' de color que se debería aplicar para oscurecer un trozo de papel 'blanco' (un espacio de color sustractivo). Ten en cuenta que K es la abreviatura de "blacK" (negro), que es un valor de intensidad negado de la imagen. Como esto es muy común, los canales 'RGB' también tienen una nomenclatura alternativa de 'Cian', 'Magenta' y 'Amarillo', o simplemente las letras 'C', 'M' e 'Y', aunque en realidad se refieren al mismo conjunto de canales que se usa para las imágenes 'RGB'. También se añade un cuarto canal de color especial para el canal de color 'Negro' o 'K'. Esto básicamente significa que el canal de color de "Verde" en realidad se refiere exactamente al mismo canal de color que se usaría para "Magenta". El que los datos en sí sean 'verde' o 'magenta' depende NO del nombre del canal, sino del 'espacio de color' de la imagen en memoria. Lo mismo ocurre con otros espacios de color. Por ejemplo, usar un espacio de color 'LAB' significa que el canal 'Rojo' contiene el valor de 'Luminosidad', mientras que el canal 'Verde' contiene el valor 'A' (o rojo-verde), y el canal 'Azul' contiene el valor 'B' (o azul-amarillo).
De forma similar, los nombres de canal 'Alpha' ('A'), 'Opacity' ('O') y 'Matte' son todos alias para el ajuste "[-channel](https://imagemagick.org/command-line-options/#channel)" que se refiere a la información de transparencia de la imagen. No importa que un canal 'alfa' sea el inverso de un canal 'mate', sigue refiriéndose al mismo canal y produce el mismo resultado, el canal mate interno de la imagen. El que un operador trate los datos del canal alfa interno como datos 'alfa' o como valor depende del operador. Los operadores de canal de bajo nivel como "[-threshold](https://imagemagick.org/command-line-options/#threshold)" trabajan sobre los datos 'mate' en bruto del canal en memoria. Sin embargo, la mayoría de los operadores de nivel superior como "[-fx](https://imagemagick.org/command-line-options/#fx)" y "[-composite](https://imagemagick.org/command-line-options/#composite)" tratan esos datos como representativos de datos 'alfa', a efectos de la operación. Hay otro método más de controlar el espacio de color de los datos de imagen almacenados. El "[-set](https://imagemagick.org/command-line-options/#set) colorspace" (añadido en IM v6.4.3-7) cambiará solo el ajuste de 'espacio de color' en memoria. Es decir, puede convertir una imagen RGB en una imagen HSL pero sin cambiar ni modificar los datos de píxel reales que usa la imagen. El uso más típico de esto es cuando estás combinando datos de canal manualmente para establecer cuál es el espacio de color final de la imagen combinada.
Así que veamos cómo podemos manipular los canales de color. Recuerda que cada canal es simplemente una matriz de valores. Todos los canales se combinarían luego para representar el color real de cada píxel dentro de la imagen.
Separar imágenes de canal
La forma más fácil de separar los canales de color individuales es usar el operador "[-separate](https://imagemagick.org/command-line-options/#separate)" para extraer el contenido actual de cada canal como una imagen en escala de grises.
magick rose: -channel R -separate separate_red.gif
magick rose: -channel G -separate separate_green.gif
magick rose: -channel B -separate separate_blue.gif
| Observa cómo la rosa roja es prominente en la imagen del canal rojo, mientras que es bastante oscura en los canales azul y verde. Por otro lado, las hojas verdes son prominentes en el canal verde pero no en los otros. El blanco cerca de la parte inferior de la imagen es brillante en todos los canales. | En IM v5 y anteriores, "-channel" no solo era un ajuste para operaciones de imagen posteriores, sino que en ocasiones también era un 'operador de imagen' que convertía el canal especificado en una imagen en escala de grises. ¡Muy confuso! En IM v6 se creó "-separate" para 'separar' estas dos tareas muy diferentes. La opción "-channel" es solo un ajuste que usan las operaciones de imagen posteriores, mientras que "-separate" extraerá los canales especificados en imágenes separadas en escala de grises y completamente opacas. |
|---|---|
A partir de IM v6.2.9-3, el operador "-separate" te permitirá separar múltiples canales de color según el ajuste "-channel". El número de elementos en el ajuste "-channel" determinará el número de imágenes creadas (en orden RGBA). Por ejemplo, como el ajuste predeterminado "-channel" es 'RGB', la acción predeterminada es crear tres imágenes, que muestro a continuación. |
magick rose: -separate separate_RGB_%d.gif
Y aquí usamos el operador "-colorspace" para convertir la forma en que IM almacena los datos de color de la imagen a una representación de color CMYK. Luego extraemos los cuatro canales de color implicados.
magick rose: -colorspace CMYK -separate separate_CMYK_%d.gif
La última imagen (el canal 'Negro' o 'K') es especialmente interesante, ya que parece ser una imagen en escala de grises negada de la imagen original. En realidad, representa la cantidad de 'tinta' que una impresora CMYK debería depositar sobre el papel, reduciendo la cantidad de color necesaria por los otros canales de color. Ten en cuenta que, de forma predeterminada, el ajuste "-channel" no incluye el canal de transparencia mate especial de la imagen. Si quieres generar siempre todos los canales que estén presentes, puedes usar un ajuste de canal "-channel ALL", o usar un ajuste "-channel" de 'RGBA' o 'CMYKA'.
Canales en escala de grises a partir de representaciones de espacios de color
Puedes extraer valores de canal específicos de los espacios de color para fines especiales. Por ejemplo, aquí extraemos el brillo o intensidad en escala de grises de la imagen de la rosa, usando varias representaciones distintas.
magick rose: -colorspace Gray channel_gray.gif
magick rose: -grayscale Rec709Luma channel_luma709.gif
magick rose: -grayscale Rec601Luma channel_luma601.gif
magick rose: -colorspace HSI -channel B -separate channel_average.gif
magick rose: -colorspace HSL -channel B -separate channel_lightness.gif
magick rose: -colorspace HSB -channel B -separate channel_brilliance.gif
magick rose: -colorspace CMYK -channel K -negate -separate channel_black.gif
magick rose: -colorspace LAB -channel R -separate channel_lab_light.gif
![[Salida de IM]](../static/img/color_basics/channel_gray.gif)
Gray
Gray | ![[Salida de IM]](../static/img/color_basics/channel_luma709.gif)
Rec709Luma
| ![[Salida de IM]](../static/img/color_basics/channel_luma601.gif)
Rec601Luma (Y)
YUV/YIQ | ![[Salida de IM]](../static/img/color_basics/channel_average.gif)
Promedio (I)
HSI/OHTA | ![[Salida de IM]](../static/img/color_basics/channel_lightness.gif)
Luminosidad
HSL | ![[Salida de IM]](../static/img/color_basics/channel_brilliance.gif)
Brillo
HSB | ![[Salida de IM]](../static/img/color_basics/channel_black.gif)
Negro neg.
CMYK | ![[Salida de IM]](../static/img/color_basics/channel_luma709.gif)
Luminancia*
LAB / LUV
---|---|---|---|---|---|---|---
Para las fórmulas reales, consulta la referencia oficial de la opción "[-colorspace](https://imagemagick.org/command-line-options/#colorspace)". Ten en cuenta que, a partir de IM v6.7.7, las imágenes en escala de grises se almacenan sin modificaciones de gamma ni sRGB, tanto en memoria como al guardarse. Por eso tienden a ser más oscuras de lo que eran antes de esta versión. Ten en cuenta que 'Gray' (también conocido como 'Intensidad' o más exactamente 'Luminancia') y la 'Luma' del espacio de color YUV son equivalentes. De forma similar, el 'Brillo' del espacio de color HSB y el canal 'Negro' (blacK) negado del espacio de color CMYK son equivalentes (y normalmente excesivamente brillantes para su uso en escala de grises). Ten en cuenta que el canal 'Luminosidad' del espacio de color LAB (y también LUV) (que no debe confundirse con la 'Luminosidad' de HSL) se considera la mejor coincidencia con la percepción visual humana, aunque no se usa comúnmente para generar imágenes en escala de grises. Ten en cuenta que, dada una imagen en escala de grises, todas las imágenes en escala de grises de los espacios de color producen exactamente la misma imagen que la imagen en escala de grises de entrada, con la excepción de la imagen del canal 'Luminosidad' ('R') para un espacio de color LAB / LUV.
Otros métodos de separación de canales
Un método es copiar un canal a todos los demás canales, para generar una imagen en escala de grises, igual que lo que genera el operador Separate. Un método simple, pero lento, es usar el operador casero FX.
magick rose: -fx R channel_red.gif
magick rose: -fx G channel_green.gif
magick rose: -fx B channel_blue.gif
A menudo se considera la solución 'más simple' de entender, y se ha usado en otros tutoriales de IM. Otros métodos implican usar multitud de técnicas para 'poner a cero' los canales no deseados. Estos se enumeran en Poner a cero canales de color más abajo, y suelen ser mucho más rápidos que usar "[-fx](https://imagemagick.org/command-line-options/#fx)".
Combinar imágenes de canal RGB
Una vez que hayas separado todos los canales de color de la imagen y los hayas procesado, también necesitarás poder volver a unir las imágenes. Esto puede hacerse usando el operador de lista especial "[-combine](https://imagemagick.org/command-line-options/#combine)", que es básicamente exactamente lo inverso de "-separate".
magick separate_red.gif separate_green.gif separate_blue.gif \
-combine -set colorspace sRGB rose_combined.gif
Estos luego se "[-combine](https://imagemagick.org/command-line-options/#combine)" para crear una imagen que se declara como una imagen de espacio de color sRGB. Un usuario quería poder intercambiar los canales rojo y azul de una imagen; esto lo hace fácil: separa los canales, intercambia y vuelve a combinar. |
magick rose: -separate -swap 0,2 -combine rose_rb_swap.gif
![[Salida de IM]](../static/img/color_basics/rose_rb_swap.gif)
Recuerda que el ajuste predeterminado "[-channel](https://imagemagick.org/command-line-options/#channel)" es 'RGB', y define qué imágenes de canal se están uniendo. Si no se definen todos los canales que se están combinando, los otros canales se establecen usando los valores de color del ajuste "-background" actual. Sin embargo, debes tener en cuenta que tanto "[-combine](https://imagemagick.org/command-line-options/#combine)" como "-separate" ignorarán el orden en que se definen los canales mediante "[-channel](https://imagemagick.org/command-line-options/#channel)". Los canales siempre se procesarán y generarán en el orden de canal estándar 'Red,Green,Blue,Matte', para cada canal establecido en el ajuste "[-channel](https://imagemagick.org/command-line-options/#channel)". Por eso, aunque uses un ajuste "-channel BR" o simplemente "blue,red", el operador "-combine" seguirá esperando que las dos imágenes sean primero el rojo y luego el azul. Los valores verde y alfa (si las imágenes tienen transparencia) se establecerán a partir de los valores del ajuste "-background" actual. Por ejemplo...
magick separate_red.gif separate_blue.gif -background black \
-channel blue,red -combine rose_red_blue.gif
Combinar imágenes de canal no RGB
A partir de IM v6.4.3-7, también puedes "[-combine](https://imagemagick.org/command-line-options/#combine)" imágenes de canal que representan otros espacios de color, pero necesitas decirle a IM en qué espacio de color debería estar la imagen resultante. Esto se hace usando el operador especial "[-set](https://imagemagick.org/command-line-options/#set) colorspace". Esto básicamente cambia el espacio de color de una imagen en memoria pero sin mapear los datos de píxel de la imagen, dejándolos como están. Una vez que la imagen se ha combinado en el espacio de color correcto, puedes usar un operador "[-colorspace](https://imagemagick.org/command-line-options/#colorspace)" normal para volver a mapear los datos de píxel a datos RGB normales. |
magick separate_HSB_?.gif -set colorspace HSB -combine \
-colorspace sRGB rose_HSB_combined.gif
![[Salida de IM]](../static/img/color_basics/rose_HSB_combined.gif)
Este método también funciona para imágenes CMYK, que a menudo son difíciles de manejar debido a la necesidad de un cuarto canal de color. |
magick separate_CMYK_?.gif -set colorspace CMYK -combine \
-colorspace sRGB rose_CMYK_combined.gif
![[Salida de IM]](../static/img/color_basics/rose_CMYK_combined.gif)
Una solución alternativa (para versiones anteriores de IM) es cargar una imagen (el canal rojo) y cambiarla de modo que esté en el espacio de color correcto. Después de eso, cada imagen de canal individual puede cargarse y copiarse en el canal de esa imagen ya preparada. |
magick separate_HSB_0.gif -colorspace HSB \
separate_HSB_0.gif -compose CopyRed -composite \
separate_HSB_1.gif -compose CopyGreen -composite \
separate_HSB_2.gif -compose CopyBlue -composite \
-colorspace sRGB rose_HSB_combined_alt.gif
![[Salida de IM]](../static/img/color_basics/rose_HSB_combined_alt.gif)
Por supuesto, si usaste la operación "[-set](https://imagemagick.org/command-line-options/#set) colorspace", los datos del primer canal ya estarán en su sitio, ya que esto no cambia los datos de píxel reales, solo la forma en que se interpretan los datos. | El último ejemplo no funcionará para imágenes 'CMYK', ya que la imagen del canal 'Negro' no contiene en realidad un canal negro. Por eso "-compose CopyBlack" no encontrará datos válidos que copiar. Yo lo consideré un error, pero actualmente es poco probable que se corrija.
---|---
Usar otros espacios de color puede ser útil. Por ejemplo, aquí tomo la imagen de rosa incorporada y quiero negar el canal de luminancia de la imagen en el espacio de color 'Lab'. Cuando termino, vuelvo a combinar para construir de nuevo una imagen sRGB. |
magick rose: -colorspace Lab -separate \
\( -clone 0 -negate \) -swap 0 +delete \
-combine -set colorspace Lab \
-colorspace sRGB rose_light_neg.gif
![[Salida de IM]](../static/img/color_basics/rose_light_neg.gif)
| _Anteriormente este ejemplo usaba el espacio de color 'HSL', pero ese es un espacio de color lineal, y queremos negar en un 'espacio de color perceptual' como el que proporciona 'Lab'.
_
---|---
Observa que la imagen sigue teniendo los mismos colores, pero el brillo (luminosidad) de los colores se invirtió, produciendo un efecto extraño. Puedes reemplazar el "-negate" por tu propio conjunto de operaciones para ajustar los niveles de brillo de una imagen. Sin embargo, como "-negate" es en sí mismo un operador controlado por canal, no tuvimos que "-separate" el canal de luminancia para negarlo. |
magick rose: -colorspace Lab \
-channel R -negate +channel \
-colorspace sRGB rose_light_neg2.gif
![[Salida de IM]](../static/img/color_basics/rose_light_neg2.gif)
Como puedes ver, esto simplifica las cosas, pero puede que no siempre sea práctico para el efecto que quieres conseguir.
Poner a cero canales de color
A veces tienes una imagen (RGB o algún otro espacio de color) en la que simplemente quieres borrar o 'poner a cero' uno o dos de los canales de color pero dejar todos los demás canales como están. Por ejemplo, para hacer una imagen en escala de grises sin usar técnicas de escala de grises RGB, podrías 'poner a cero' el canal de saturación ('G') en un espacio de color HSL, de modo que se cree una imagen en escala de grises. El valor de 'Tono' no tiene sentido cuando la saturación es cero, así que te queda una imagen en escala de grises. La técnica más directa suele ser usar el operador Evaluate para poner a cero todos los valores del canal no deseado... |
magick rose: -colorspace HSL \
-channel G -evaluate set 0 +channel \
-colorspace sRGB rose_grey.gif
![[Salida de IM]](../static/img/color_basics/rose_grey.gif)
Sin embargo, hay muchas formas no tan obvias de hacer esto...
# Evaluate (rápido y directo)
-channel G -evaluate set 0 +channel
# Puesta a cero con FX (directo y simple, pero lento)
-channel G -fx 0 +channel
# Separar los canales que quieres conservar,
# luego combinar usando un color de fondo para establecer los otros canales
-channel RB -separate -background black -combine +channel
# Gamma, que es un mal uso del operador, ¡pero funciona MUY bien!
# ( 1 = dejar igual; 0 = poner a cero el canal; -1 = maximizar el canal )
# ¡Esto es corto, simple, no necesita ajuste de canal, pero muy enrevesado!
-gamma 1,0,1
# Umbralizar canales a cero
-channel G -threshold 101% +channel
# Umbralizar al valor máximo y luego negar a cero
-channel G -threshold -1 -negate +channel
# Multiplicar con un color primario/secundario apropiado
# ¡El color especifica los canales a conservar! 'magenta' = 'rojo'+'azul'
\( +clone +level-colors magenta \) -compose multiply -composite
# Colorear canales específicos a negro
# (0 = dejar igual; 100% establecer desde el relleno (negro) )
-fill black -colorize 0,100%,0
¿Se te ocurre alguna otra forma de poner a cero (o maximizar) un canal de color que no haya enumerado arriba? -- escríbeme
Espacios de color
Hasta ahora nos hemos concentrado en los espacios de color 'sRGB', 'RGB' y 'CMYK'. Es decir, porque estos son los espacios de color que se usan normalmente para mostrar, imprimir y almacenar tradicionalmente las imágenes en archivos. Pero aunque estos espacios de color son prácticos, no son representativos de cómo nosotros, los humanos, vemos realmente el mundo. Nuestros ojos pueden ver en longitudes de onda roja, verde y azul, pero nuestros cerebros las interpretan como: tono del color (qué color), grisura (cuán colorido) e intensidad (cuán brillante/oscuro). Debido a esto, se han desarrollado muchos espacios de color y sistemas de color, a menudo a partir de requisitos completamente independientes. Los pintores, por ejemplo, desarrollaron un sistema de colores (basado en fuentes de color como el lapislázuli), sombras y matices. Más tarde, los sistemas informáticos que usaban RGB necesitaron mejores formas para que los usuarios seleccionaran o modificaran colores, de maneras que no fueran demasiado intensivas computacionalmente.
Espacios de color basados en el tono
Probablemente una de las alternativas más conocidas es el sistema basado en el tono cíclico, que se desarrolló como una interfaz de selección de color para colores RGB. Básicamente, el cubo de color RGB se rotó en 3 dimensiones, de modo que el eje diagonal negro-gris-blanco del cubo se convirtió en un eje del espacio de color. Y este especificaba cuán oscuro o claro era un color. La característica clave de este cambio fue una conversión simple a partir de los valores RGB que espaciaba los colores primarios por igual alrededor de este eje, de modo que formaran un tono que cicla del rojo, pasando por el verde, luego el azul y de vuelta al rojo. Lo lejos que estaba el color de este eje (radialmente) se conocía como saturación o croma.
Por ejemplo, separemos los canales de la imagen 'rose:' incorporada después de transformarla al espacio de color 'HSB' (Hue, Saturation, Brilliance — tono, saturación, brillo —, también conocido como HSV, con V de Value, valor).
magick rose: -colorspace HSB -separate separate_HSB_%d.gif
O el similar, pero no exactamente igual, 'HSL' (Hue, Saturation, Lightness — tono, saturación, luminosidad).
magick rose: -colorspace HSL -separate separate_HSL_%d.gif
Observa cómo la imagen del canal 'Tono' en ambos espacios de color es el mismo moteado de colores casi puros, blanco y negro. Es decir, porque un tono es en realidad circular. Es decir, tanto el negro como el blanco de la imagen de canal anterior son en realidad representaciones de un tono 'Rojo', y ligeras variaciones hacen que el tono salte de un lado del rojo (produciendo blanco) al otro (produciendo negro). Si esto supone un problema, puedes rotar el ajuste de tono usando el operador Modulate de modo que el rojo pase a estar representado por algún otro valor de tono. La diferencia real entre 'HSL' y 'HSB' está en cuán brillantes se definen los colores primarios. Pero para ver esto, es mejor que veamos representaciones más prácticas del espacio de color, usando ruedas de color. Si miras las últimas imágenes de 'brillo/luminosidad' en las separaciones anteriores, verás que 'HSB' trata un color 'rojo' fuerte (casi primario) como casi blanco, mientras que 'HSL' lo trata más bien como una intensidad de gris de tono medio.
Generar una rueda de color HSL
Las separaciones en bruto anteriores del color de una imagen siguen siendo difíciles de entender. Para entender mejor el espacio de color, necesitamos intentar verlo. El espacio de color se representa más habitualmente como un gradiente polar circular, que muestra alguna parte del espacio de color. Puedes generar las imágenes de valor de canal por separado y combinarlas para generar tipos específicos de imágenes que son difíciles de generar de otras formas. Por ejemplo, aquí generamos una rueda de color 'HSL' perfecta.
magick -size 100x300 gradient: -rotate 90 \
-distort Arc '360 -90.1 50' +repage \
-gravity center -crop 100x100+0+0 +repage angular.png
magick -size 100x100 xc:white solid.png
magick -size 100x100 radial-gradient: -negate radial.png
magick angular.png solid.png radial.png \
-combine -set colorspace HSL \
-colorspace sRGB colorwheel_HSL.png
![[Salida de IM]](../static/img/color_basics/angular.png)
Tono | ![[Salida de IM]](../static/img/color_basics/solid.png)
Saturación | ![[Salida de IM]](../static/img/color_basics/radial.png)
Luminancia | | ![[Salida de IM]](../static/img/color_basics/colorwheel_HSL.png)
Rueda de color HSL
---|---|---|---|---
| _Las imágenes en escala de grises se generan como un gradiente lineal usando valores sRGB. Por eso los gradientes tienden a verse un poco más oscuros de lo que deberían. Sin embargo, lo importante aquí son los valores de las imágenes de entrada, no el espacio de color de visualización.
Por otro lado, la imagen resultante, aunque se genera en el espacio de color RGB lineal, se guarda como espacio de color sRGB para garantizar que los navegadores y otros programas de visualización de imágenes muestren el gradiente de una forma que funcione bien visualmente._
---|---
Ten en cuenta también que el tono es un valor de 'módulo', que da la vuelta en el rojo (valor de tono = 0). Esto puede ser un fastidio al hacer procesamiento de imágenes, ya que tienes dos colores rojos que visualmente son idénticos, pero que en términos de valor están a una distancia máxima de tono. Este no es un buen espacio de color para usar cuando se trabaja con diferencias de color. En realidad, los canales de luminosidad/brillo de los espacios de color HSB y HSL no son muy útiles, ya que los distintos tonos no se manejan por igual. Básicamente, 'igualan' la intensidad de los colores primarios. Por ejemplo, rotar un tono 'amarillo' para que se convierta en un tono 'azul', por ejemplo, hará que el color muy brillante se vuelva muy oscuro, y viceversa. Para más detalles consulta Desventajas de HSL. Se aconseja precaución.
Hay varios espacios de color que también usan este mismo sistema de tono basado en el 'hexcono'. HSB, HCL y HCLp (HCL perceptual). Aquí hay ruedas de color de los cuatro de estos espacios de color de 'hexcono'.
magick angular.png solid.png radial.png \
-combine -set colorspace HSL \
-colorspace sRGB colorwheel_HSL.png
magick angular.png solid.png radial.png \
-combine -set colorspace HSB \
-colorspace sRGB colorwheel_HSB.png
magick angular.png solid.png radial.png \
-combine -set colorspace HCL \
-colorspace sRGB colorwheel_HCL.png
magick angular.png solid.png radial.png \
-combine -set colorspace HCLp \
-colorspace sRGB colorwheel_HCLp.png
![[Salida de IM]](../static/img/color_basics/colorwheel_HSL.png)
HSL | ![[Salida de IM]](../static/img/color_basics/colorwheel_HSB.png)
HSB | ![[Salida de IM]](../static/img/color_basics/colorwheel_HCL.png)
HCL | ![[Salida de IM]](../static/img/color_basics/colorwheel_HCLp.png)
HCLp
---|---|---|---
Recuerda que todos los colores mostrados arriba se generan a la saturación de color máxima. Sin embargo, el espacio de color 'HSB' producirá colores primarios a la luminosidad máxima (HSL los generaba a la mitad de intensidad). Debido a esto, el blanco solo puede generarse cuando la saturación es cero. Como resultado, en lugar de un área blanca alrededor de los bordes, obtienes colores completamente saturados. El espacio de color 'HCL' usa los mismos cálculos de tono de 'hexcono', pero ajusta el canal de 'luminosidad' de modo que use la intensidad del color, en lugar de valores RGB lineales directos. Como resultado, al usar el 'HCL', los colores primarios se sitúan en distintos niveles de intensidad, con el azul más cerca del color negro central, y los colores rojos mucho más brillantes y más alejados. El área de intensidad del 50% del espacio de color 'HCL' no produce colores fuertes, sino que genera colores pastel más naturales. Por ejemplo, aquí hay una comparación de los tonos saturados entre los espacios de color HSL y HCL a una intensidad del 50%.
magick -size 100x100 xc:black \
-fill white -draw 'circle 49.5,49.5 40,4' \
-fill black -draw 'circle 49.5,49.5 40,30' \
-alpha copy -channel A -morphology dilate diamond anulus.png
magick hue_angular.png -size 100x100 xc:white xc:gray50 \
-combine -set colorspace HSL -colorspace RGB \
anulus.png -alpha off -compose Multiply -composite \
anulus.png -alpha on -compose DstIn -composite \
-colorspace sRGB hues_HSL.png
magick hue_angular.png -size 100x100 xc:white xc:gray50 \
-combine -set colorspace HCL -colorspace RGB \
anulus.png -alpha off -compose Multiply -composite \
anulus.png -alpha on -compose DstIn -composite \
-colorspace sRGB hues_HCL.png
Es decir, no quiere decir que 'HCL' no contenga colores puros, simplemente no se 'fuerzan' a un plano común como ocurre en el espacio de color 'HSL'. En particular, observa cómo todos los tonos en HCL tienen la misma intensidad del 50% (como se solicitó), a diferencia de los resultados de los tonos del espacio de color HSL. El verde es probablemente el más cercano de todos los colores principales a una intensidad del 50%, así que tiene una buena respuesta en los tonos al 50%. Se recomienda usar este espacio de color para las rotaciones de tono, de modo que se conserve el brillo general de todos los colores de la imagen. Consulta los ejemplos en Modulate en el espacio de color HCL. ¿Espacio de color HWB?
Espacios de color perceptuales
Los espacios de color 'Lab' y 'Luv' están diseñados de modo que separan completamente la intensidad en escala de grises de los componentes de color de una imagen. A diferencia de los espacios de color 'RGB' y 'sRGB'. Esto hace que el espacio de color sea mucho más fácil de procesar y modificar en general, una vez que le coges el truco. Más concretamente, 'Luv' se diseñó para ser 'perceptualmente lineal'. Es decir, que un pequeño cambio de color en una parte del espacio de color parezca ser aproximadamente el mismo que un cambio similar en otra parte del espacio de color. Esto hace que el espacio de color Luv sea mucho más adecuado para las comparaciones de diferencias de imagen. Los dos espacios de color son muy similares, y generalmente producen resultados similares al procesar imágenes. Aquí separamos los canales de los espacios de color 'Lab' y 'Luv', solo para mostrar lo similares que son en realidad los dos espacios de color.
magick rose: \( -clone 0 -colorspace LAB -separate +append \) \
\( -clone 0 -colorspace LUV -separate +append \) \
-delete 0 -append -set colorspace sRGB separate_lab_luv.png
Luv
---|---|---|---
Otros mejores ejemplos del espacio de color 'Lab' y 'Luv' pueden verse usando su variación cilíndrica 'LCHab' 'LCHvu', en La rueda de color LCH más abajo. Para un ejemplo práctico de uso de estos espacios de color, consulta Redimensionar en el espacio de color Lab.
Espacios de color basados en Lab y Luv
El espacio de color 'HCL' está basado en el espacio de color 'LCHuv', que es una representación cilíndrica del espacio de color 'Luv', aunque con una fórmula más simple para el canal de luminosidad, de modo que genera blanco puro a la luminosidad máxima. Para completitud, aquí están las representaciones cilíndricas de los espacios de color 'Lab' y 'Luv', que se conocen como 'LCHab' y 'LCHuv' respectivamente. Sin embargo, ten en cuenta que el orden de los canales es el inverso del equivalente espacio de color 'HCL' mostrado arriba.
magick radial.png solid.png angular.png \
-combine -set colorspace LCHab \
-colorspace sRGB colorwheel_LCHab.png
magick radial.png solid.png angular.png \
-combine -set colorspace LCHuv \
-colorspace sRGB colorwheel_LCHuv.png
![[Salida de IM]](../static/img/color_basics/radial.png)
Luminosidad* | ![[Salida de IM]](../static/img/color_basics/solid.png)
Croma | ![[Salida de IM]](../static/img/color_basics/angular.png)
Tono | | ![[Salida de IM]](../static/img/color_basics/colorwheel_LCHab.png)
LCHab | ![[Salida de IM]](../static/img/color_basics/colorwheel_LCHuv.png)
LCHuv
---|---|---|---|---|---
Ten en cuenta que el espacio de color 'LCH' es un alias de 'LCHab'. En lo anterior puedes ver que 'LCHuv' tiene una discontinuidad donde se establecen colores no realistas mediante el proceso de la rueda de color. Las conversiones normales de imágenes no generarán estos colores.
Espacio de color scRGB de alto rango dinámico
Wikipedia: http://en.wikipedia.org/wiki/ScRGB
Este es esencialmente un método de almacenar un color de alto rango dinámico
(con negativos y hasta 10 veces el rango RGB lineal) en un entero de 16 bits,
con solo 1/2 de la resolución de color de una imagen sRGB normal de 16 bits.
Como usa enteros de 16 bits, puede almacenarse en formatos de archivo de imagen que puedan
guardar tales imágenes (PNG, PPM, MIFF), aunque debería usarse un perfil de color, u otro
método para marcar esas imágenes como portadoras de datos de espacio de color scRGB.
Tendrías que tener mucho cuidado con muchos operadores de procesamiento de imágenes en
este espacio de color, ya que tiene un 'desplazamiento' para permitirle manejar números negativos.
Y aunque algunos operadores como resize y distort pueden usarse directamente en este
espacio de color, probablemente sea mejor idea usar una versión HDRI de ImageMagick,
y convertir a RGB lineal (con negativos), para un procesamiento de imágenes más general.
_Sería bueno tener ejemplos y más información sobre el uso de este espacio de color_
Reemplazar colores en imágenes
ImageMagick proporciona de forma natural una serie de opciones para reemplazar un color específico y los colores casi coincidentes por otro color. Esto es estupendo cuando se trata de iconos e imágenes de tipo 'mapa de bits' que contienen muy pocos colores, pero tiende a fallar cuando se trata de imágenes que contienen tonos de colores o píxeles de borde con suavizado. Básicamente, debes recordar que los colores se reemplazan por un solo tono. Así que si reemplazas un conjunto o vecindario de colores, todos esos colores se reemplazan por un único color específico y no por un rango de colores coincidente. Esto no quiere decir que sea imposible hacer un reemplazo de color sombreado, solo que no es sencillo de hacer por ahora, sin mucho trabajo. Aun así, las imágenes GIF no permiten el uso de semitransparencia, así que reemplazar colores de esta forma es un buen método para controlar la transparencia de fondo de los GIF (consulta GIFs sobre un patrón de fondo para ver ejemplos). El otro aspecto es que, aunque puedes mapear todos los 'colores cercanos' a un mapa de color dado, usando mapas de color predefinidos, no hay un operador que haga un mapeo directo uno a uno de un gran conjunto de colores a otro conjunto de colores completamente diferente. Esta es una carencia que puede cambiar en una versión futura de IM. Con esa advertencia, veamos las formas que IM proporciona para el reemplazo directo de un color específico por otro color.
Reemplazar un color específico
Los operadores "[-opaque](https://imagemagick.org/command-line-options/#opaque)" y "[-transparent](https://imagemagick.org/command-line-options/#transparent)" están diseñados para reemplazar un color de una imagen por otro. Por ejemplo, para reemplazar un color 'blue' por, digamos, 'white', usarías un comando como este... |
magick balloon.gif -fill white -opaque blue balloon_white.gif
![[Salida de IM]](../static/img/color_basics/balloon_white.gif)
Básicamente, cualquier color que fuera 'azul' se ha reemplazado por el color "[-fill](https://imagemagick.org/command-line-options/#fill)" actual. Sin embargo, a partir de IM v6.2.7, este operador está limitado por el ajuste "[-channel](https://imagemagick.org/command-line-options/#channel)". Por eso, para convertir un color (digamos azul) en transparencia, necesitarás especificar un "[-channel](https://imagemagick.org/command-line-options/#channel)" que incluya el canal alfa para hacer los colores transparentes. También necesitarás asegurarte de que la imagen tenga un canal 'mate' o canal alfa habilitado, para almacenar la información de transparencia. |
magick balloon.gif -alpha set -channel RGBA \
-fill none -opaque blue balloon_none.gif
![[Salida de IM]](../static/img/color_basics/balloon_none.gif)
Como reemplazar un color por transparencia es una operación tan común, lo anterior tiene su propio operador especial de reemplazo por transparencia "[-transparent](https://imagemagick.org/command-line-options/#transparent)". |
magick balloon.gif -transparent blue balloon_trans.gif
![[Salida de IM]](../static/img/color_basics/balloon_trans.gif)
A partir de la versión 6.3.7-10 de IM, las versiones 'plus' de estos operadores invierten la selección de color. Es decir, los colores que NO coincidan con el color dado serán reemplazados. Por ejemplo, aquí reemplazo cualquier color que NO sea negro puro por blanco, dejando solo los bordes negros puros de la imagen. |
magick balloon.gif -fill white +opaque black balloon_borders.gif
![[Salida de IM]](../static/img/color_basics/balloon_borders.gif)
Esto puede no parecer gran cosa, pero cuando lo combinas con un factor de difuminado (ver más abajo), se convierte en una herramienta muy potente. | Antes de IM v6.3.7-10, la operación inversa requería el uso de cierta astucia usando máscaras de imagen. Básicamente, reemplazas el color que quieres conservar por transparencia, y luego "[-colorize](https://imagemagick.org/command-line-options/#colorize)" todos los demás colores al color deseado para crear una máscara de superposición. Esta se superpone luego sobre la imagen original para 'enmascarar' los colores que no coincidían. | |
magick balloon.gif \
\( +clone -alpha set -transparent black \
-fill white -colorize 100% \) \
-composite balloon_mask_non-black.gif
![[Salida de IM]](../static/img/color_basics/balloon_mask_non-black.gif)
Como puedes ver, la forma 'plus' del operador simplificó enormemente la operación de reemplazo 'no este color'.
Para técnicas de reemplazo más avanzadas, te sugiero que eches un vistazo a Eliminación de fondo. | _Ten en cuenta que, como todos los colores coincidentes (especialmente los 'colores con coincidencia difusa', ver más abajo) se reemplazan por un único color uniforme, no obtendrás ningún suavizado de los bordes de las áreas coloreadas. Y perderás todos los efectos de sombra u otros efectos de sombreado que puedan estar presentes. Esto puede tener un efecto seriamente perjudicial en el aspecto de cualquier imagen que no sea simple o de tipo dibujo animado.
Este tipo de reemplazo de color no está diseñado pensando en imágenes prácticas del mundo real, sino más bien para efectos de enmascaramiento de imagen. Se aconseja precaución._
---|---
El reemplazo de color "[-opaque](https://imagemagick.org/command-line-options/#opaque)" no puede reemplazar un color por un patrón en mosaico. Solo reemplazará colores por otro único color específico. Sin embargo, ambos métodos de reemplazo de color, "[-draw](https://imagemagick.org/command-line-options/#draw)" y "[-floodfill](https://imagemagick.org/command-line-options/#floodfill)", sí pueden (ver más abajo).
Reemplazar usando un color de la imagen
También puedes usar el reemplazo de color con Draw para recolorear imágenes basándote en los colores presentes en la propia imagen, en lugar de un color específico. |
magick present.gif -fill red -draw 'color 0,0 replace' present_blue.gif
![[Salida de IM]](../static/img/color_basics/present_blue.gif)
Observa que nunca especifiqué el color que se ha de reemplazar, solo la ubicación del color que se ha de reemplazar. Es el color en esa ubicación el que se usa para 'hacer coincidir' qué áreas se han de rellenar, independientemente de cuál sea ese color. Puedes ver en el ejemplo anterior el problema del reemplazo de color: el color específico puede aparecer en otros lugares de los que pretendes, lo que nos da una línea de píxeles rojos dentro de la imagen del 'regalo' anterior. La transparencia tampoco presenta ningún problema, aunque algunas partes internas de la imagen también se hicieron transparentes, igual que se volvieron rojas en lo anterior... |
magick present.gif -alpha set -fill none \
-draw 'color 0,0 replace' present_none.gif
![[Salida de IM]](../static/img/color_basics/present_none.gif)
Ten en cuenta, sin embargo, que a diferencia de "[-opaque](https://imagemagick.org/command-line-options/#opaque)" y "[-transparent](https://imagemagick.org/command-line-options/#transparent)", el reemplazo de color con Draw no te permite invertir los 'colores coincidentes' que se han de reemplazar. Draw también tiene un reemplazo de mate especial, donde solo se reemplaza la transparencia del color de relleno. Es decir, puedes hacer que todos los colores coincidentes sean transparentes, o semitransparentes, sin cambiar realmente el color del píxel en sí. Con el formato de archivo apropiado, por supuesto. |
magick present.gif -alpha set -fill '#00000080' \
-draw 'matte 0,0 replace' present_semi.png
![[Salida de IM]](../static/img/color_basics/present_semi.png)
Esto se vuelve mucho más útil cuando también se especifica un factor de difuminado. La mayor ventaja de usar "[-draw](https://imagemagick.org/command-line-options/#draw)" es que también puedes reemplazar el color por un patrón en mosaico. Por ejemplo... |
magick present.gif -tile pattern:right30 \
-draw 'color 0,0 replace' present_tile.gif
![[Salida de IM]](../static/img/color_basics/present_tile.gif)
Para técnicas de reemplazo más avanzadas, te sugiero que eches un vistazo a Eliminación de fondo.
Relleno por inundación con Draw
Los métodos de color con Draw también te proporcionan un método sencillo de reemplazar un color mediante 'relleno por inundación'. Es decir, en lugar de reemplazar TODOS los colores coincidentes dentro de la imagen, puedes seleccionar solo los colores que están 'conectados a' o 'adheridos a' el punto especificado en la imagen. El punto especificado no solo especificará el punto de inicio (punto semilla), sino también el color que estás intentando reemplazar. |
magick present.gif -fill red -draw 'color 0,0 floodfill' present_fill.gif
![[Salida de IM]](../static/img/color_basics/present_fill.gif)
Observa que las áreas rojas que no estaban 'adheridas' al píxel 0,0 no se reemplazaron. Para el reemplazo de fondo eso puede ser un problema, pero la solución es igual de fácil. Expande ligeramente la imagen para que el relleno por inundación pueda 'filtrarse' en la imagen desde todas las direcciones, y luego elimina ese espacio adicional cuando termines. |
magick present.gif -bordercolor white -border 1x1 \
-fill red -draw 'color 0,0 floodfill' \
-shave 1x1 present_bgnd.gif
![[Salida de IM]](../static/img/color_basics/present_bgnd.gif)
Por supuesto, puedes ajustar qué colores 'coinciden' usando el ajuste de control del factor de difuminado más abajo, que es especialmente importante para las imágenes JPEG.
Operador de relleno por inundación
El operador "[-floodfill](https://imagemagick.org/command-line-options/#floodfill)" se añadió para hacer el relleno por inundación algo más fácil, especialmente cuando quieres especificar exactamente el color que quieres reemplazar específicamente. Esto puede ser especialmente importante cuando se usa la coincidencia de color del factor de difuminado. Sin embargo, ten en cuenta que si ese punto semilla no está dentro de una coincidencia del factor de difuminado del color que buscas, entonces "[-floodfill](https://imagemagick.org/command-line-options/#floodfill)" no hace nada. Esto puede considerarse tanto una característica del operador como su maldición.
Se recomienda un factor de difuminado pequeño para el relleno por inundación.
O asegúrate de que el punto semilla coincida exactamente con el color buscado.
Por ejemplo, añade un borde de color conocido para rellenar por inundación desde los bordes... |
magick present.gif -bordercolor white -border 1x1 \
-fill red -floodfill +0+0 white \
-shave 1x1 present_floodfill.gif
![[Salida de IM]](../static/img/color_basics/present_floodfill.gif)
Esto reemplazará cualquier color que sea 'blanco' por 'rojo' que forme parte directamente del área que rodea el píxel semilla que comienza en +0+0, que está garantizado que es 'blanco' debido al borde añadido. También puedes rellenar por inundación con un patrón en mosaico. |
magick present.gif -bordercolor white -border 1x1 \
-tile pattern:left30 -floodfill +0+0 white \
-shave 1x1 present_pattern.gif
![[Salida de IM]](../static/img/color_basics/present_pattern.gif)
El argumento 'color ' a veces puede ser un fastidio, en el sentido de que debe coincidir con el color del punto semilla, o no se realizará ninguna acción. Pero esto también puede ser útil, ya que garantizará que el relleno por inundación haga exactamente lo que querías, y no lo inesperado. Por ejemplo, aquí intento rellenar discos blancos con varios colores... |
magick disks.gif \
-fill Red -floodfill +30+50 white \
-fill Green -floodfill +60+60 white \
-fill Blue -floodfill +10+40 white \
floodfill_hit_miss.gif
![[Salida de IM]](../static/img/color_basics/floodfill_hit_miss.gif)
En este caso, solo las operaciones de relleno por inundación 'Green' y 'Blue' 'acertaron un disco' (y lo rellenaron), mientras que el relleno por inundación 'Red' no coincidió con un disco, así que no se rellenó ningún disco, sin rellenar accidentalmente el fondo de la imagen. También significa que si ya rellenaste un área específica, los rellenos posteriores no 'rerrellenarán' la misma área si dos puntos aciertan esa área. Eso puede ahorrar mucho tiempo. Quizás también quieras echar un vistazo a Dilatación condicional, que representa una operación de relleno por inundación de más bajo nivel desde múltiples puntos 'semilla' de la imagen.
Factor de difuminado: coincidencia de colores similares/múltiples
Los resultados generales de seleccionar simplemente un único color para reemplazar, como se mostró en los ejemplos anteriores, normalmente no son muy buenos. Los bordes o áreas de colores sólidos generalmente tienen una mezcla de colores en el borde, debido al suavizado (consulta Suavizado para más información). Por eso deberías evitar el reemplazo directo de color si es posible. Por ejemplo, aquí tomo lo que parece una sencilla 'vaca' en blanco y negro e intento convertirla en una vaca roja.
magick cow.gif -fill red -opaque black cow_replace_red.gif
Como puedes ver, solo las partes centrales de las áreas 'negras' se volvieron realmente rojas. Es decir, porque, aunque la imagen parece ser en blanco y negro, en realidad es una imagen en escala de grises con casi todos los bordes en varios tonos de gris. Es decir, no son exactamente de color negro puro. El factor de difuminado ("[-fuzz](https://imagemagick.org/command-line-options/#fuzz)") representa una coincidencia de 'similitud' en distancia esférica multidimensional entre colores, usando cualquiera que sea el espacio de color que use la imagen. Bueno, vale, intentemos eso en lenguaje sencillo. Tienes un color específico. Otro color se tratará como igual que el color que se busca, si la diferencia entre estos colores es menor que el ajuste del factor de difuminado. Cuanto mayor sea el 'factor de difuminado', más colores 'cercanos' coincidirán y serán reemplazados. Así que intentemos eso en nuestra imagen de la vaca para convertir no solo el negro puro, sino también los colores casi negros, en rojo.
magick cow.gif -fuzz 40% -fill red -opaque black cow_replace_fuzz.gif
Como puedes ver, ahora reemplazamos todos los píxeles 'oscuros' de la imagen por rojo. Pero el resultado sigue siendo muy malo, con un tinte grisáceo en el borde y fuertes efectos de aliasing. El reemplazo directo de color no es una buena solución para esta imagen, aunque puedas hacer que funcione usando un 'factor de difuminado' grande. Consulta los ejemplos en Ajustes de nivel por color para ver la solución ideal para esta imagen. Este problema es aún peor para las imágenes en las que intentas reemplazar un color de fondo por transparencia. Básicamente acabas con un 'halo' alrededor del objeto sobre ese color de fondo. Esto es muy difícil de resolver, y problemas como este se ven en detalle en Eliminación de fondo. Qué operaciones usan el factor de difuminado El operador "[-fuzz](https://imagemagick.org/command-line-options/#fuzz)" afecta prácticamente a cualquier operador que compare colores específicos dentro de una imagen. Esto incluye: "[-opaque](https://imagemagick.org/command-line-options/#opaque)", "[-transparent](https://imagemagick.org/command-line-options/#transparent)", "[-floodfill](https://imagemagick.org/command-line-options/#floodfill)", "[-trim](https://imagemagick.org/command-line-options/#trim)", "[-deconstruct](https://imagemagick.org/command-line-options/#deconstruct)", "[-draw](https://imagemagick.org/command-line-options/#draw) 'color'", "[-draw](https://imagemagick.org/command-line-options/#draw) 'matte'", y probablemente otros. También afecta a "[-layers](https://imagemagick.org/command-line-options/#layers) [OptimizeTransparency](anim_opt.html#opt_trans)" de GIF, y al manejo de "[-compose](https://imagemagick.org/command-line-options/#compose) [ChangeMask](compose.html#changemask)". También afecta a los resultados de "magick compare" y específicamente al "[-metric](https://imagemagick.org/command-line-options/#metric) AE", o recuento de píxeles de error absoluto.
Distancia del factor de difuminado
El ajuste "[-fuzz](https://imagemagick.org/command-line-options/#fuzz)" es en realidad una forma de ajuste de 'distancia' de color. Cualquier color que esté dentro de la distancia dada del color que se busca coincidirá con ese color, aunque no sea una coincidencia exacta. Un valor de '200' representa una distancia de 200 unidades de color en la profundidad de color actual del IM que se está usando. Para un IM Q16 (calidad de 16 bits para el almacenamiento de color), esto es bastante pequeño; para un IM Q8 esto es MUY grande, y hará que muchos colores coincidan entre sí. Aquí, por ejemplo, cambio todos los colores que están dentro de 30.000 unidades de color (para IM Q16) de 'blue' a blanco. Con mis programas de ImageMagick Q16, eso representa aproximadamente la distancia de 'blue' a 'navy' (azul oscuro a la mitad), |
magick colorwheel.png \
-fuzz 30000 -fill white -opaque blue \
opaque_blue.jpg
![[Salida de IM]](../static/img/color_basics/opaque_blue.jpg)
Para que esto sea más fácil de entender, aquí invierto los colores coincidentes, convirtiendo en blanco los colores no coincidentes. |
magick colorwheel.png \
-fuzz 30000 -fill white +opaque blue \
opaque_blue_not.png
![[Salida de IM]](../static/img/color_basics/opaque_blue_not.png)
Si tu IM es más antiguo que la versión 6.3.7-10, cuando se añadió la forma 'plus' del operador "[-opaque](https://imagemagick.org/command-line-options/#opaque)", puedes usar este método de enmascaramiento para invertir el resultado de la coincidencia de color... |
magick colorwheel.png \
\( +clone -fuzz 30000 -transparent blue \
-channel RGB +level-colors white +channel \) \
-composite opaque_blue_inv.png
![[Salida de IM]](../static/img/color_basics/opaque_blue_inv.png)
O este método que limita todas las modificaciones solo al 'canal alfa', de modo que todos los colores originales se dejan como están. Es decir, creas una máscara negada a partir de la selección de color, de modo que todos los colores no seleccionados se vuelvan completamente transparentes. ¡Siguen presentes, solo que transparentes! |
magick colorwheel.png -fuzz 30000 -transparent blue \
-channel A -negate +channel opaque_blue_inv_alpha.png
![[Salida de IM]](../static/img/color_basics/opaque_blue_inv_alpha.png)
Una ventaja de estos métodos alternativos es que puedes ampliarlos para generar una técnica de 'no múltiples colores'. Todo lo que necesitas hacer es añadir más colores a la lista que se hace transparente, antes de negar la máscara, y posiblemente eliminar la transparencia negada. |
magick colorwheel.png \
-fuzz 25000 -transparent blue -transparent red -transparent lime \
-channel A -negate +channel \
-background white -alpha remove opaque_multi_inv.png
| _Como dato de interés, en un IM con un ajuste de compilación Q8, un factor "[-fuzz](https://imagemagick.org/command-line-options/#fuzz)" de 256 (28) hará que los colores 'black' y 'blue' sean equivalentes. Para un IM con un ajuste Q16, este número es 65536 (216).
Para hacer que los colores 'blue' y 'red' coincidan, este número debe multiplicarse por la raíz cuadrada de 2, o sea 362 para IM Q8, y 92682 para IM Q16.
Para hacer que todos los colores coincidan (p. ej. los colores 'black' y 'white'), necesitarás multiplicar por la raíz cuadrada de 3. En otras palabras, un ajuste del factor de difuminado de 444 para IM Q8 y 113512 para IM Q16.
---|---
| _Es probable que puedan definirse distancias de color mejores y más realistas usando un espacio de color 'perceptual', como 'LAB' o 'LUV'. Simplemente convierte las imágenes a ese espacio de color antes de realizar la coincidencia de color difusa. Esto hará que colores como el azul puro y el negro estén mucho más cercanos, y el amarillo y el blanco más cercanos, de lo que están en los espacios de color 'sRGB' o 'RGB' lineal.
---|---
Como puedes ver por las fórmulas anteriores, las distancias de color directas no son ni mucho menos una forma agradable de establecer el factor de difuminado que se ha de usar, ya que también depende de exactamente qué ajuste de calidad en tiempo de compilación se use. Establecer el factor "[-fuzz](https://imagemagick.org/command-line-options/#fuzz)" como porcentaje hace que su uso sea mucho más simple. En este caso, '100%' representa un factor de difuminado lo bastante grande como para cubrir todos los colores. Es decir, representa la distancia de color de 'black' a 'white', a través de la diagonal tridimensional del cubo de color RGB. Aquí reemplazamos por blanco cualquier color que esté dentro del 90% de la distancia de blanco a negro. Esto debería dar como resultado que solo el último 10% de colores cercanos al 'black' queden en la imagen, ya que el negro está en el lado opuesto del cubo de color RGB. |
magick colorwheel.png -fuzz 90% -fill white -opaque white opaque_w90.jpg
![[Salida de IM]](../static/img/color_basics/opaque_w90.jpg)
Ten en cuenta que este 90% representa una esfera de colores alrededor del 'blanco' en el cubo de color RGB. Sin embargo, esto no es lo mismo que reemplazar los colores que no están dentro de una esfera del 10% del negro. |
magick colorwheel.png -fuzz 10% -fill white +opaque black opaque_k10.jpg
Como puedes ver, una esfera del 10% de colores cercanos al negro es mucho más uniforme que seleccionar una esfera del 90% de los colores alrededor del blanco. Piensa en cómo una esfera grande centrada en la esquina blanca de un cubo llena ese cubo. Luego piensa en una esfera pequeña centrada en la esquina negra, y serás capaz de entender la diferencia entre las dos imágenes. ![[Salida de IM]](../static/img/color_basics/opaque_k10.jpg)
| _Un factor "[-fuzz](https://imagemagick.org/command-line-options/#fuzz)" del 100% equivale a la distancia del cubo de color RGB de 'black' a 'white'. A partir de esto podemos calcular que un porcentaje de aproximadamente 57,7% es la distancia entre 'black' y 'blue', y 81,6% es la distancia de 'blue' a 'red' o de cualquiera de esos colores a 'white'.
En resumen, cualquier valor superior a aproximadamente el 25% (justo por debajo de la distancia RGB de 'blue' a 'navy blue') representa un cambio de color muy grande._
---|---
Para demostrar más las distancias de color, usemos un porcentaje de factor de difuminado progresivamente mayor alrededor de los colores azules...
magick colorwheel.png -fuzz 10% -fill white -opaque blue opaque_b10.jpg
magick colorwheel.png -fuzz 25% -fill white -opaque blue opaque_b25.jpg
magick colorwheel.png -fuzz 57% -fill white -opaque blue opaque_b57.jpg
magick colorwheel.png -fuzz 81% -fill white -opaque blue opaque_b81.jpg
magick colorwheel.png -fuzz 95% -fill white -opaque blue opaque_b95.jpg
De esto puedes ver claramente que no es el 'black' ni el 'white' el color más distante del 'blue', sino que en realidad es el 'yellow' el más distante dentro del espacio de color RGB. Ten en cuenta también que una diferencia de color del 81% se quedará justo a las puertas de coincidir con un color 'red' puro, sin embargo, aunque el rojo puro no coincida con otros rojos, (excluyendo los colores rojo-naranja) sí coinciden. Es decir, de nuevo debido a la naturaleza 'esférica' de la coincidencia de color. La moraleja es que probablemente sea mejor usar varias coincidencias con factores "[-fuzz](https://imagemagick.org/command-line-options/#fuzz)" pequeños, o una 'coincidencia invertida' más pequeña, que un único valor grande. Aquí comparamos los colores de la imagen con otro color, el color 'gris casi perfecto', cambiando los colores similares a ese mismo color gris a medida que aumenta el 'factor de difuminado'.
magick colorwheel.png -fuzz 25% -fill gray50 -opaque gray50 opaque_g25.jpg
magick colorwheel.png -fuzz 30% -fill gray50 -opaque gray50 opaque_g30.jpg
magick colorwheel.png -fuzz 35% -fill gray50 -opaque gray50 opaque_g35.jpg
magick colorwheel.png -fuzz 45% -fill gray50 -opaque gray50 opaque_g45.jpg
magick colorwheel.png -fuzz 51% -fill gray50 -opaque gray50 opaque_g51.jpg
Como puedes ver, los colores de la imagen de la rueda de color apenas empiezan a coincidir con un factor de difuminado justo antes del 30%, y aumentan lentamente hasta que, al 45%, todos los colores salvo los más extremos han desaparecido. Para el 51%, todos los colores de la imagen han coincidido con el gris casi perfecto. Lo que estás viendo es el resultado de la forma en que los colores RGB están dispuestos en un cubo en el espacio tridimensional. Sin embargo, la imagen de la 'rueda de color' solo contiene 'colores completamente saturados', lo que básicamente significa todos los colores extremos que se sitúan en las caras exteriores del cubo de color RGB. Un gris perfecto, sin embargo, se sitúa en el centro del cubo, bastante distante de todos los 'colores saturados'. Por eso, no es hasta que alcanzas un factor de difuminado grande del 28% cuando el color en medio de las caras del cubo empieza a coincidir. A medida que el factor de difuminado se hace mayor, cada vez más colores coincidirán hasta que solo queden los colores en las esquinas extremas del cubo de color. Alrededor del 50%, los colores de las esquinas también empezarán a coincidir, y así, al 51%, todos los colores RGB opacos habrán coincidido.
Factor de difuminado y colores transparentes
Usar un factor "[-fuzz](https://imagemagick.org/command-line-options/#fuzz)" se vuelve más complicado cuando la coincidencia implica colores transparentes y semitransparentes. Por ejemplo, aquí creo un gradiente entre negro y blanco, a lo largo de la imagen, pero luego añado un gradiente transparente verticalmente. Después hago una coincidencia de color difusa para un color gris perfecto (es decir, gris al 50%). En imágenes posteriores hago que el color que se compara sea más transparente hasta que es completamente transparente; sin embargo, el factor de difuminado permanece constante en el 20%.
magick -size 100x100 gradient: \( +clone -rotate 90 \) +swap \
-compose CopyOpacity -composite trans_gradient.png
magick trans_gradient.png -channel RGBA \
-fuzz 20% -fill Gray50 -opaque 'GrayA(50%,1.0)' fuzz_trans_100.png
magick trans_gradient.png -channel RGBA \
-fuzz 20% -fill Gray50 -opaque 'GrayA(50%,.75)' fuzz_trans_75.png
magick trans_gradient.png -channel RGBA \
-fuzz 20% -fill Gray50 -opaque 'GrayA(50%,.40)' fuzz_trans_40.png
magick trans_gradient.png -channel RGBA \
-fuzz 20% -fill Gray50 -opaque 'GrayA(50%,0.0)' fuzz_trans_00.png
Ten en cuenta que el uso de "-channel RGBA" en lo anterior no es para la coincidencia de color, sino para especificar los canales de color que se van a 'rellenar'. Es decir, sin él, lo anterior seguirá haciendo coincidir los mismos colores, pero el 'relleno' gris permanecerá semitransparente, y no se establecerá a un color gris opaco. Si quieres hacer coincidir todos los colores independientemente de su transparencia, entonces necesitarás desactivar el canal transparente de la imagen, al menos temporalmente. Puedes volver a activarlo después, aunque tu color de relleno volverá a tener la misma transparencia que el color original. En la primera imagen, al hacer coincidir con un color gris completamente opaco (alfa='1.0'), obtienes una coincidencia muy esférica de todos los colores grises casi opacos. Sin embargo, a medida que el color que se compara se vuelve más semitransparente, el número de colores semitransparentes coincidentes que coinciden parecerá hacerse mayor, hasta que un gris completamente transparente coincidirá con cualquier color casi transparente. Lo que ocurre es que, a medida que aumenta la transparencia, la distancia entre los colores semitransparentes disminuye. Cuanto más transparentes son dos colores, más cercanos estarán los colores, en comparación con sus equivalentes opacos. Cuando ambos colores son completamente transparentes, los dos colores se considerarán una coincidencia perfecta, o de distancia '0'. La otra cosa que hay que observar es que (a partir de IM v6.6.6-4) la distancia desde un color completamente transparente (gris o de otro tipo) es puramente una función de la transparencia del color (valor alfa). La última imagen de lo anterior hizo coincidir todos los píxeles que estaban dentro del 20% de ser completamente transparentes, independientemente del color real. Esto también significa que un factor de difuminado grande con un color completamente transparente (como 'none') puede usarse para hacer coincidir todos, o casi todos, los colores semitransparentes. Por ejemplo... |
magick trans_gradient.png -channel RGBA \
-fuzz 95% -fill Gray50 -opaque None \
-alpha off fuzz_trans.jpg
![[Salida de IM]](../static/img/color_basics/fuzz_trans.jpg)
Observa que solo el 5% superior de los colores casi opacos de lo anterior no coincidió, mientras que todos los demás colores semitransparentes se volvieron grises. El "[-alpha](https://imagemagick.org/command-line-options/#alpha) off" final elimina el último resto de semitransparencia de la imagen. Debido a esto, el ajuste "[-channel](https://imagemagick.org/command-line-options/#channel) RGBA" no es en realidad necesario, pero se recomienda por completitud. Este ejemplo es esencialmente equivalente a un umbralizado del canal alfa, antes de añadir una capa de color gris por debajo (para hacer grises los colores transparentes) | Antes de IM v6.6.6-4, la coincidencia de color difusa no hacía coincidir por igual los colores completamente transparentes con los opacos. De hecho, el negro era una coincidencia mucho más cercana que el blanco. Por eso el último ejemplo fallará. Consulta Error de distancia de difuminado y colores transparentes para más detalles.
---|---
| Peor aún, antes de IM v6.2.6-2, la coincidencia de color difusa no consideraba todos los colores completamente transparentes como el mismo color. Es decir, el negro completamente transparente (también conocido como 'None') no era el mismo que el blanco completamente transparente (o el color '#FFF0'), aunque ambos sean completamente transparentes.
---|---
En construcción
Matemáticas de color (obtener el promedio de dos o más colores)....
Ejemplo de promedio de dos colores... Digamos '#000000' y '#DDDDDD'
Generalmente los colores se añaden a las imágenes, y el resultado se saca como una
imagen 'txt:-' de un solo píxel, de la cual se puede extraer el color.
* usa -resize para fusionar los colores
magick -size 2x1 xc:'#000000' -fill '#DDDDDD' \
-draw 'point 0,0' -resize 1x1 txt:-
* ¡Usa -evaluate-sequence mean en ellos!
magick -size 1x1 xc:'#000000' xc:'#DDDDDD' \
-evaluate-sequence mean txt:-
O para muchos colores puedes usar el filtro de redimensionado 'Box'
magick rose: -filter Box -resize 1x1\! txt:
# ImageMagick pixel enumeration: 1,1,255,RGB
0,0: (145, 89, 80) #915950
* Usa -fx para aplicar la fórmula que quieras
magick -size 1x1 xc:'#000000' xc:'#DDDDDD' \
-fx '(u+v)/2' txt:-
Con una API de ImageMagick, los resultados pueden recuperarse más directamente de la
imagen.
![[Salida de IM]](../static/img/color_basics/colorspace_RGB.png)
![[Salida de IM]](../static/img/color_basics/colorspace_LUV.png)
![[Salida de IM]](../static/img/color_basics/colorspace_LAB.png)
![[Salida de IM]](../static/img/color_basics/color_hex_1.png)
![[Salida de IM]](../static/img/color_basics/color_hex_2.png)
![[Salida de IM]](../static/img/color_basics/color_hex_3.png)
![[Salida de IM]](../static/img/color_basics/color_hex_4.png)
![[Salida de IM]](../static/img/color_basics/color_hex_5.png)
![[Salida de IM]](../static/img/color_basics/color_hex_6.png)
![[Salida de IM]](../static/img/color_basics/color_rgba_1.png)
![[Salida de IM]](../static/img/color_basics/color_rgba_2.png)
![[Salida de IM]](../static/img/color_basics/color_rgba_3.png)
![[Salida de IM]](../static/img/color_basics/color_rgba_4.png)
![[Salida de IM]](../static/img/color_basics/color_rgba_5.png)
![[Salida de IM]](../static/img/color_basics/color_rgba_6.png)
![[Salida de IM]](../static/img/color_basics/color_name_1.png)
![[Salida de IM]](../static/img/color_basics/color_name_2.png)
![[Salida de IM]](../static/img/color_basics/color_name_3.png)
![[Salida de IM]](../static/img/color_basics/color_name_4.png)
![[Salida de IM]](../static/img/color_basics/color_name_5.png)
![[Salida de IM]](../static/img/color_basics/color_name_6.png)
![[Salida de IM]](../static/img/color_basics/separate_red.gif)
![[Salida de IM]](../static/img/color_basics/separate_green.gif)
![[Salida de IM]](../static/img/color_basics/separate_blue.gif)
![[Salida de IM]](../static/img/color_basics/channel_red.gif)
![[Salida de IM]](../static/img/color_basics/channel_green.gif)
![[Salida de IM]](../static/img/color_basics/channel_blue.gif)
![[Salida de IM]](../static/img/color_basics/rose_combined.gif)
![[Salida de IM]](../static/img/color_basics/rose_red_blue.gif)
![[Salida de IM]](../static/img/color_basics/separate_HSB_0.gif)
![[Salida de IM]](../static/img/color_basics/separate_HSB_1.gif)
![[Salida de IM]](../static/img/color_basics/separate_HSB_2.gif)
![[Salida de IM]](../static/img/color_basics/separate_HSL_0.gif)
![[Salida de IM]](../static/img/color_basics/separate_HSL_1.gif)
![[Salida de IM]](../static/img/color_basics/separate_HSL_2.gif)
![[Salida de IM]](../static/img/color_basics/hues_HSL.png)
![[Salida de IM]](../static/img/color_basics/hues_HCL.png)
![[Salida de IM]](../static/img/color_basics/separate_lab_luv.png)
![[Salida de IM]](../static/img/images/cow.gif)
![[Salida de IM]](../static/img/color_basics/cow_replace_red.gif)
![[Salida de IM]](../static/img/color_basics/cow_replace_fuzz.gif)
![[Salida de IM]](../static/img/color_basics/opaque_multi_inv.png)
![[Salida de IM]](../static/img/color_basics/opaque_b10.jpg)
![[Salida de IM]](../static/img/color_basics/opaque_b25.jpg)
![[Salida de IM]](../static/img/color_basics/opaque_b57.jpg)
![[Salida de IM]](../static/img/color_basics/opaque_b81.jpg)
![[Salida de IM]](../static/img/color_basics/opaque_b95.jpg)
![[Salida de IM]](../static/img/color_basics/opaque_g25.jpg)
![[Salida de IM]](../static/img/color_basics/opaque_g30.jpg)
![[Salida de IM]](../static/img/color_basics/opaque_g35.jpg)
![[Salida de IM]](../static/img/color_basics/opaque_g45.jpg)
![[Salida de IM]](../static/img/color_basics/opaque_g51.jpg)
![[Salida de IM]](../static/img/color_basics/trans_gradient.png)
![[Salida de IM]](../static/img/color_basics/fuzz_trans_100.png)
![[Salida de IM]](../static/img/color_basics/fuzz_trans_75.png)
![[Salida de IM]](../static/img/color_basics/fuzz_trans_40.png)
![[Salida de IM]](../static/img/color_basics/fuzz_trans_00.png)