Combinar colores RGB

Temas sobre programación ( php, c, sql, html, perl, python, ruby, java, bash, etc ) y recursos ( herramientas, frameworks, hosting, cms, etc )

Moderadores: akodo, maiku

Avatar de Usuario
tuxman
Forista Distinguido
Forista Distinguido
Mensajes: 1026
Registrado: Lun Feb 26, 2007 8:00 am
Ubicación: Guadalajara, Jalisco. Mexico
Contactar:

Combinar colores RGB

Mensaje por tuxman » Lun Jun 28, 2010 7:16 am

Saludos Colegas Linuxeros.

Este dia les vengo con otro de mis dilemas.

Estoy trabajando en una aplicacion que realiza ciertas tareas graficas, y mi problema actual es la combinacion de colores. Me explico:

Tengo dos conjuntos de colores, color A y color B. Ambos, son, a su vez, formados por tres valores enteros, es un color RGB, por lo que son sus correspondientes valores en Rojo, Verde y Azul.

Bien, mi problema es que tengo que determinar el color resultante al combinar dos colores cualquiera y retornar un conjunto C con sus tres correspondientes valores de RGB. El dilema surge en que no puedo hacer una sumatoria vil pues, creo, no es el procedimiento correcto.

He estado buscando y solo encuentro respuestas del tipo "bien, combinar colores es sencillo, con la herramienta X de este lenguaje Y", siendo Y, casi siempre, Java y Visual Basic, o bien, tristemente, muchas respuestas como "combinemos los colores adecuadamente, asi nuestra casa se vera mas amplia". Por lo que recurro a ustedes en busca de ayuda.

Cada color esta representado por una estructura de tipo t_Color, la cual yo he definido, y esta estructura contiene tres variables de tipo entero:

Código: Seleccionar todo

struct t_Color
{
    int r , g , b;
};
Y la idea que yo tenia era esta, para combinar dos colores:

Código: Seleccionar todo

struct t_Color combina ( struct t_Color A , struct t_Color B )
{
   struct t_Color C;
   C.r = A.r + B.r;
   C.g = A.g + B.g;
   C.b = A.b + B.b;
   return ( C );
}
Obviamente me da problemas pues colores que no tienen nada que ver (digamos, un gris claro y y uno oscuro) podrian darme colores no reales, y ese es mi punto, necesito crear colores "realistas", algo como un gris claro y amarillo te de un amarillo mas oscuro, mas o menos asi.

Espero puedan ayudarme.
Edita los nombres de tus post con "[SOLUCIONADO]" cuando encuentres una solución a tu problema.

Lenovo G470
Intel Core i3 2.1 GHz (2310M)
Chakra Linux.
Avatar de Usuario
akodo
Moderador
Moderador
Mensajes: 1457
Registrado: Mié Nov 28, 2007 8:00 am
Ubicación: En la X del explorer (pulse para llamar)

Re: Combinar colores RGB

Mensaje por akodo » Lun Jun 28, 2010 12:19 pm

Lo más seguro es que estés utilizando un espacio de color erróneo. Según wikipedia (http://en.wikipedia.org/wiki/Color_space), RGB se utiliza con luces, con lo que desde el punto de vista lumínico puede resultar correcto.
Si lo que quieres es mantenerte con RGB, tal vez sería mejor cambiar a otro espacio de color más adecuado, operar ahí y luego volver al RGB.

Prueba también haciendo la media aritmética, a ver qué sale ((A+B)/2 para cada componente).
Descargue el gestor de mp3 "Music Manager" -> ([url=http://ctrlalt.iespana.es]mmlf[/url])
Última versión del gestor "Music Manager" -> ([url=http://sourceforge.net/projects/jmusicmanager/]jmmm[/url])
Avatar de Usuario
dbfuentes
Forista Menor
Forista Menor
Mensajes: 68
Registrado: Jue Dic 20, 2007 8:00 am
Contactar:

Re: Combinar colores RGB

Mensaje por dbfuentes » Lun Jun 28, 2010 4:43 pm

Se supone que se saca con las medias, ejemplo:

Se va a combinar un rojo RGB(255,0,0) = Rojo con un amarillo RGB(255,255,0) = Amarillo, eso te debe dar un naranja, o sea:

Código: Seleccionar todo

             Rojo     Amarillo
Rojo  = (    255   +     255      ) / 2 = 255
Verde = (     0    +     255      ) / 2 = 128
Azul  = (     0    +      0       ) / 2 = 0
el resultado es un naranja RGB(255,128,0)= naranja

otro ejemplo (el que tu mencionaste) amarillo RGB(255,255,0) = Amarillo + gris RGB(191,191,191)=gris

Código: Seleccionar todo

             Amarillo     Gris
Rojo  = (    255   +     191      ) / 2 = 223
Verde = (    255   +     191      ) / 2 = 223
Azul  = (     0    +     191      ) / 2 = 96
resultando un amarillo oscuro RGB(223,223,96) = amarillo oscuro

Otro ejemplo:

azul RGB(0,0,255) (Azul) + Blanco RGB(255,255,255) (blanco) = azul claro RGB(128,128,255) (Azul claro)

y así sucesivamente
"When in doubt, use brute force." Ken Thompson (1943 - )
Mi Blog
Perfil en ohloh
Avatar de Usuario
cerenkov
Forista Medio
Forista Medio
Mensajes: 402
Registrado: Jue Jun 17, 2010 5:23 am
Ubicación: Venezuela

Re: Combinar colores RGB

Mensaje por cerenkov » Lun Jun 28, 2010 6:24 pm

No sé nada sobre esto pero lo primero que se me ocurre es buscar cuales son los algoritmos para la combinación de colores. Aquí ya obtengo documentos al respecto como estos:

http://www.visionaustralia.org.au/info.aspx?page=959

http://es.wikipedia.org/wiki/Colores_HTML

http://www.pagaelpato.com/tecno/colores.htm

http://www.ars-logo-design.com/es/ar_rgb.htm

Una vez que desentrañemos el algoritmo (donde los números hexadecimales parecen jugar un papel relevante) entonces si se puede proponer código.

Saludos

Nota: Intuitivamente se puede vislumbrar que no puede ser con medias aritméticas. Supon que tienes un color muy abundante (A) y le agregas una muy pequeña cantidad de otro (B). Si la combinación se ajustara a la media aritmética te daría algo intermedio y no tiene sentido. Se tiene que parecer a A. La media aritmética no es la única medida de tendencia central. Existen otras como la moda y la mediana; pero aquí tampoco son aplicables. Debe ser algún tipo de media pero PONDERADA (es decir con pesos) o puede ser más sencillo: una suma de hexadecimales. Eso es lo que hay que encontrar.
Avatar de Usuario
tuxman
Forista Distinguido
Forista Distinguido
Mensajes: 1026
Registrado: Lun Feb 26, 2007 8:00 am
Ubicación: Guadalajara, Jalisco. Mexico
Contactar:

Re: Combinar colores RGB

Mensaje por tuxman » Lun Jun 28, 2010 6:50 pm

Mmmm... Creo que de momento me seria util la respuesta de dbfuentes, vere que tan bien sale, :P.

Gracias, espero volver con resultados :D.
Edita los nombres de tus post con "[SOLUCIONADO]" cuando encuentres una solución a tu problema.

Lenovo G470
Intel Core i3 2.1 GHz (2310M)
Chakra Linux.
Avatar de Usuario
cerenkov
Forista Medio
Forista Medio
Mensajes: 402
Registrado: Jue Jun 17, 2010 5:23 am
Ubicación: Venezuela

Re: Combinar colores RGB

Mensaje por cerenkov » Lun Jun 28, 2010 10:19 pm

tuxman escribió:Mmmm... Creo que de momento me seria util la respuesta de dbfuentes, vere que tan bien sale, :P.

Gracias, espero volver con resultados :D.
Yo tengo experiencia con el manejo de colores pero no a nivel de programación. Lo usaba para definir el color de horizontes de suelo con una Tabla Munsell. Este venía definido por el Matiz, el Hue y la Croma, es decir, tres parámetros. Por eso es que me parece, de manera intuitiva, que una media aritmética no puede ser lo más adecuado para describir las combinaciones de colores reales. Si encuentro algo por allí te lo hago llegar.

Saludos
Avatar de Usuario
akodo
Moderador
Moderador
Mensajes: 1457
Registrado: Mié Nov 28, 2007 8:00 am
Ubicación: En la X del explorer (pulse para llamar)

Re: Combinar colores RGB

Mensaje por akodo » Lun Jun 28, 2010 11:48 pm

cerenkov escribió: Yo tengo experiencia con el manejo de colores pero no a nivel de programación. Lo usaba para definir el color de horizontes de suelo con una Tabla Munsell. Este venía definido por el Matiz, el Hue y la Croma, es decir, tres parámetros. Por eso es que me parece, de manera intuitiva, que una media aritmética no puede ser lo más adecuado para describir las combinaciones de colores reales. Si encuentro algo por allí te lo hago llegar.

Saludos
Pero ese es otro modelo de color (HSV creo) con otras caracteristicas diferentes al RGB. Para el HSV no puedes hacer una media aritmética ni ponderada de los valores, al menos con la idea de obtener el color intermedio. Seguro que meto la pata, pero a lo mejor, para el HSV sólo tienes que hacer la media de los valores V (realmente no tengo ni idea :| ).
cerenkov escribió: Nota: Intuitivamente se puede vislumbrar que no puede ser con medias aritméticas. Supon que tienes un color muy abundante (A) y le agregas una muy pequeña cantidad de otro (B). Si la combinación se ajustara a la media aritmética te daría algo intermedio y no tiene sentido. Se tiene que parecer a A. La media aritmética no es la única medida de tendencia central. Existen otras como la moda y la mediana; pero aquí tampoco son aplicables. Debe ser algún tipo de media pero PONDERADA (es decir con pesos) o puede ser más sencillo: una suma de hexadecimales. Eso es lo que hay que encontrar.
En principio no puedes hacer una media ponderada porque no sabes qué cantidad hechas de un color (la función sólo contempla los colores a mezclar). Es por eso que se opta por hacer una media aritmética. No obstante, sí puede ser interesante añadir otra función para esto.

La suma de hexadecimales que propones viene a ser lo mismo que lo que ya ha desechado tuxman. Al fin y al cabo, el color #FF0000 (rojo) es el mismo que el [255,0,0] en RGB. Los dos primeros valores hexadecimales para el rojo, los dos siguientes para el verde, y los dos últimos para el azul. Pasando esos valores a decimal tienes el valor RGB en cuestión.
Descargue el gestor de mp3 "Music Manager" -> ([url=http://ctrlalt.iespana.es]mmlf[/url])
Última versión del gestor "Music Manager" -> ([url=http://sourceforge.net/projects/jmusicmanager/]jmmm[/url])
Avatar de Usuario
hipersayan_x
Forista Legendario
Forista Legendario
Mensajes: 1905
Registrado: Vie Abr 27, 2007 7:00 am
Contactar:

Re: Combinar colores RGB

Mensaje por hipersayan_x » Mar Jun 29, 2010 12:51 am

Los componentes del vector color normalmente están dentro del intervalo [0, 255].
Por ejemplo, si sumamos lisa y llanamente:

(191, 223, 61) + (78, 253, 26) = (269, 476, 86)

Entonces (269, 476, 86), seria correcto matematicamente, pero se encontraria dentro de un espacio vectorial invalido para el dispositivo de video.
Lo que dice dbfuentes es correcto en un caso en el que quieras, por ejemplo solapar 2 imagenes, en ese caso la expresion correcta por cada vector(pixel) de la imagen seria:

C = A + k * (B - A) para k c [0.0, 1.0]

Para el caso que indica dbfuentes seria con k = 0.5
Pero tambien podrias aplicar operaciones logicas, como OR, AND, NOR, NAND, XOR.
Tendrias que decirnos, mas claramente que tipo de combinacion de colores queres realizar.
Desarrollo en Qt: Qt Developer Network
Mis proyectos: github | SourceForge.net
Avatar de Usuario
cerenkov
Forista Medio
Forista Medio
Mensajes: 402
Registrado: Jue Jun 17, 2010 5:23 am
Ubicación: Venezuela

Re: Combinar colores RGB

Mensaje por cerenkov » Mar Jun 29, 2010 4:17 am

hipersayan_x escribió:Los componentes del vector color normalmente están dentro del intervalo [0, 255].
Por ejemplo, si sumamos lisa y llanamente:

(191, 223, 61) + (78, 253, 26) = (269, 476, 86)

Entonces (269, 476, 86), seria correcto matematicamente, pero se encontraria dentro de un espacio vectorial invalido para el dispositivo de video.

Lo que dice dbfuentes es correcto en un caso en el que quieras, por ejemplo solapar 2 imagenes, en ese caso la expresion correcta por cada vector(pixel) de la imagen seria:

C = A + k * (B - A) para k c [0.0, 1.0]

Para el caso que indica dbfuentes seria con k = 0.5
Pero tambien podrias aplicar operaciones logicas, como OR, AND, NOR, NAND, XOR.
Tendrias que decirnos, mas claramente que tipo de combinacion de colores queres realizar.
Yo simplemente estoy señalando porque no me parece de manera intuitiva. No estoy proponiendo algoritmos de ninguna especie (para eso señale unos artículos que encontré googleando). Por otra parte, eso que tu señalas de solapar imágenes es muy diferente a combinar colores y refuerzas lo que yo estoy señalando de porque no debe ser tratado con una media aritmética. Tampoco señale que lo de la media ponderada fuese correcto.

Con relación a lo de la suma fuera del espacio vectorial del dispositivo de video podriamos hacer que una vez que llegue a 255 comience a adicionar desde cero.

Por otra parte, "puede ser" denota amplitud y no seguridad en lo que estoy afirmando. Además, señale que "Eso es lo que hay que encontrar". No estoy afirmando nada de manera tajante.

Estas conversaciones son muy fructíferas.

Saludos
Avatar de Usuario
hipersayan_x
Forista Legendario
Forista Legendario
Mensajes: 1905
Registrado: Vie Abr 27, 2007 7:00 am
Contactar:

Re: Combinar colores RGB

Mensaje por hipersayan_x » Mar Jun 29, 2010 7:12 am

cerenkov escribió: Yo simplemente estoy señalando porque no me parece de manera intuitiva. No estoy proponiendo algoritmos de ninguna especie (para eso señale unos artículos que encontré googleando).
Es que la mejor manera de enfrentar la colorimetría digital es usando álgebra lineal.
Puede que no parezca muy intuitivo, pero creeme que cuando a uno lo reprueban muchas, muchas, muchiiiiiisimas veces álgebra lineal aprende a resolver problemas de este tipo :D
cerenkov escribió: Con relación a lo de la suma fuera del espacio vectorial del dispositivo de video podriamos hacer que una vez que llegue a 255 comience a adicionar desde cero.
Haber, si estamos trabajando en un modo de video de 24bpp, cada pixel que se dibuja en pantalla esta definido por un unsigned long, o sea, cada componente de color esta definido por 1 byte, y los byte solo pueden adquirir valores de 0 a 255, no es posible dar valores que esten por fuera de ese intervalo, por lo tanto no hay que agregar nada para evitar los valores exedentes. Por lo tanto la estructura correcta para manejar colores es:

Código: Seleccionar todo

struct COLOR
{
 unsigned char r, g, b;
}color;
La formula a su vez asegura que los valores no van a escapar de ese intervalo.
Me faltaria poner un enlace hacia como funciona el array de video para que se entienda mejor, pero ahora mismo no encuentro el que yo use para entender el concepto :?, ya despues me pongo a buscarlo.

Por cierto, por fin alguien plantea un tema de programación realmente interesante.
Desarrollo en Qt: Qt Developer Network
Mis proyectos: github | SourceForge.net
Avatar de Usuario
cerenkov
Forista Medio
Forista Medio
Mensajes: 402
Registrado: Jue Jun 17, 2010 5:23 am
Ubicación: Venezuela

Re: Combinar colores RGB

Mensaje por cerenkov » Mar Jun 29, 2010 4:03 pm

Aquí está la demostración de porque no es la media:

http://en.wikipedia.org/wiki/RGB_color_model

azul = (0,0,255)

amarillo = (255,255,0)

azul + amarillo = verde

verde = (0,255,0)

la media es:

(127,127,127) es un gris.

Me apoyé también en la paleta de colores de Gimp. Lo que siempre sugerí es que debe haber un algoritmo para ello que no puede ser tan sencillo como plantear la media. Queda del que planteó el tema encontrarlo.

Saludos
Avatar de Usuario
hipersayan_x
Forista Legendario
Forista Legendario
Mensajes: 1905
Registrado: Vie Abr 27, 2007 7:00 am
Contactar:

Re: Combinar colores RGB

Mensaje por hipersayan_x » Mar Jun 29, 2010 4:47 pm

Ok, entonces usemos gimp como referencia, en la solapa de colores, pulsan la opción de los slides, si se fijan ahí mismo se puede ver como se realiza la combinacion de colores, y saben que formula utilizan para hacer la combinación?
C = A + k * (B - A) para k c [0.0, 1.0]
No hay que darle tantas vueltas al tema, es pura y simple álgebra lineal.

Imagen
Desarrollo en Qt: Qt Developer Network
Mis proyectos: github | SourceForge.net
Avatar de Usuario
cerenkov
Forista Medio
Forista Medio
Mensajes: 402
Registrado: Jue Jun 17, 2010 5:23 am
Ubicación: Venezuela

Re: Combinar colores RGB

Mensaje por cerenkov » Mar Jun 29, 2010 5:22 pm

hipersayan_x escribió:Ok, entonces usemos gimp como referencia, en la solapa de colores, pulsan la opción de los slides, si se fijan ahí mismo se puede ver como se realiza la combinacion de colores, y saben que formula utilizan para hacer la combinación?
C = A + k * (B - A) para k  [0.0, 1.0]
No hay que darle tantas vueltas al tema, es pura y simple álgebra lineal.

Imagen
Gracias, hipersayan_x, por colocar una fórmula. El valor de k puede tomar valores entre 0 y 1. A simple vista luce como arbitraría su escogencia pero posiblemente tiene que ver con algún criterio. Para:

azul = (0,0,255)

amarillo = (255,255,0)

azul + amarillo = verde

verde = (0,255,0)

x1=0+k*(255-0)=0 => k=0; x2=0+k*(255-0)= 255 => k=1; x3 =255+k*(0-255) = 0 => k=1

Aquí si que no lo veo para el primero (o me equivoqué en los cálculos?). Todos los k no deberían ser iguales? Cuál es el criterio para asignar un k?

Saludos
Avatar de Usuario
hipersayan_x
Forista Legendario
Forista Legendario
Mensajes: 1905
Registrado: Vie Abr 27, 2007 7:00 am
Contactar:

Re: Combinar colores RGB

Mensaje por hipersayan_x » Mar Jun 29, 2010 6:05 pm

k seria como la posición en la que se encuentra el slide, a la izquierda = 0.0, a la derecha = 1.0, y luego los valores intermedios, k es siempre un flotante, no es necesario que sea tan preciso ya que basta con 255 pasos, una variable tipo float es mas que suficiente.
Los valores de k no son arbitrarios, el problema que mas se asemeja, y del cual sale la formula es el caso de una recta en R3 que pasa por 2 puntos(los colores de los extremos), k te permite desplazarte por esa recta, si k vale 0.0 tenes uno de los colores, si vale 1.0 tenes el otro, sino valores intermedios, es lo mismo que estas viendo en la paleta de colores del gimp, podrías intentar accederte de esos valores y ver que pasa, pero nada te asegura que lo que veas en pantalla sean los valores correctos.
Desarrollo en Qt: Qt Developer Network
Mis proyectos: github | SourceForge.net
Avatar de Usuario
cerenkov
Forista Medio
Forista Medio
Mensajes: 402
Registrado: Jue Jun 17, 2010 5:23 am
Ubicación: Venezuela

Re: Combinar colores RGB

Mensaje por cerenkov » Mar Jun 29, 2010 6:30 pm

hipersayan_x escribió:k seria como la posición en la que se encuentra el slide, a la izquierda = 0.0, a la derecha = 1.0, y luego los valores intermedios, k es siempre un flotante, no es necesario que sea tan preciso ya que basta con 255 pasos, una variable tipo float es mas que suficiente.
Los valores de k no son arbitrarios, el problema que mas se asemeja, y del cual sale la formula es el caso de una recta en R3 que pasa por 2 puntos(los colores de los extremos), k te permite desplazarte por esa recta, si k vale 0.0 tenes uno de los colores, si vale 1.0 tenes el otro, sino valores intermedios, es lo mismo que estas viendo en la paleta de colores del gimp, podrías intentar accederte de esos valores y ver que pasa, pero nada te asegura que lo que veas en pantalla sean los valores correctos.
Esta parte del algebra lineal se denomina transformación lineal, por tanto, se puede asociar una matriz (3x3) a dicha transformación de tal manera que multiplicando dicha matriz por cualquier vector columna (3x1) de también un vector 3x1 (conformidad para la multiplicación de matrices).

Interesante. Gracias por tu explicación.

Un saludo :D.
Responder
  • Similar Topics
    Respuestas
    Vistas
    Último mensaje