5 votos

Conversión del espacio de color RYB y RGB

Estoy trabajando en un proyecto en el que necesito convertir los colores definidos en el espacio de color RGB (Rojo, Verde, Azul) a RYB (Rojo Amarillo Azul).

He conseguido resolver la conversión de un color del espacio RYB al RGB basándome en el artículo - Mezcla de colores inspirada en la pintura y composición para la visualización .

Convierto un color de RYB a RGB con este "algoritmo":

Por lo tanto, los valores de r (rojo), y (amarillo), y b (azul) son conocidos, también estas matrices/conjuntos son constantes:

white: [1, 1, 1]
red: [1, 0, 0]
yellow: [1, 1, 0]
blue: [0.163, 0.373, 0.6]
violet: [0.5, 0, 0.5]
green: [0, 0.66, 0.2]
orange: [1, 0.5, 0]
black: [0.2, 0.094, 0.0]

así es como calculo el valor de red para el espacio RGB basado en los parámetros anteriores:

i = 1;
rgb_red = white[i] * (1 - r) * (1 - b) * (1 - y) + 
red[i] * r * (1 - b) * (1 - y) + 
blue[i] * (1 - r) * b * (1 - y) + 
violet[i] * r * b * (1 - y) + 
yellow[i] * (1 - r) * (1 - b) * y + 
orange[i] * r * (1 - b) * y + 
green[i] * (1 - r) * b * y + 
black[i] * r * b * y);

para rgb_green exactamente lo mismo pero para i=2 y i=3 para rgb_blue .

Mi problema es que ahora quiero convertir de RGB a RYB de nuevo. Es decir, conociendo los valores de rgb_red , rgb_green y rgb_blue Quiero calcular los valores de r , y y b . Así que necesito una especie de función inversa para esto, pero no sé cómo conseguirla.

Se agradece cualquier ayuda.

4voto

maxim4d Puntos 13

Cuando escribí un programa para convertir entre todos los formatos de color más utilizados, utilicé los siguientes algoritmos para $RYB \rightarrow RGB$ y $RGB \rightarrow RYB$ conversión: http://www.insanit.net/tag/rgb-to-ryb/ (enlace a archive.org, el sitio original ha desaparecido)

Ahora no sé si esta solución funciona perfectamente con la conversión que ya tienes, parece algún tipo de multiplicación matricial. Si dividimos $(1-r)(1-b)(1-y) = 1 - r - b - y + rb + ry + by -ryb$ tenemos 8 componentes. También tenemos 8 componentes blanco[i], rojo[i], naranja[i], amarillo[i], ... por lo que se puede hacer una multiplicación matricial y sumar los valores del vector resultante para obtener $r$ (cuando $i=1$ ). Ahora para hacer una matriz inversa necesitamos más información sobre el vector resultante. Si simplemente sumamos todo lo que hay en el vector, perdemos esa información. Sigo pensando que es posible hacerlo con una matriz, pero no sé cómo crear una, aparte de hacer algunas suposiciones como $\text{white}[i]=[1,1,1]$ (que creo que será para la inversa también), y explicar por qué sería cierto.

4voto

Bob Puntos 56

Tras leer el artículo enlazado, ahora entiendo mucho más de lo que haces aquí de lo que has explicado. Y creo que puedo ayudarte a resolver tu problema.

Los autores realizan la conversión de RYB a RGB mediante un interpolación trilineal . En esencia, proporcionan valores explícitos de un mapeo de RYB a RGB en las esquinas de un cubo RYB, es decir, cada punto $(r,y,b)$ donde $r$ , $y$ y $b$ son todos $1$ o $0$ -y se interpolan linealmente a lo largo de los tres ejes en todas las demás partes.

Llamemos a ese mapeo $f: \textrm{RYB} \rightarrow \textrm{RGB}$ , donde $f$ toma un $(r,y,b)$ triplete a un $(R,G,B)$ triplete. (Utilizaré minúsculas para RYB y mayúsculas para RGB en todo momento). La interpolación se define por los siguientes hechos: $$\begin{align} \textrm{RYB}&\rightarrow\textrm{RGB}\\ f(0,0,0)&=(1,1,1)\\ f(0,0,1)&=(0.163, 0.373, 0.6)\\ f(0,1,0)&=(1,1,0)\\ f(0,1,1)&=(0, 0.66, 0.2)\\ f(1,0,0)&=(1,0,0)\\ f(1,0,1)&=(.5,.5,0)\\ f(1,1,0)&=(1,.5,0)\\ f(1,1,1)&=(0.2, 0.094, 0.0)\\ f(r,y,b)&=f(0,0,0)(1-r)(1-y)(1-b)+f(0,0,1)(1-r)(1-y)b\\ &\;+f(0,1,0)(1-r)y(1-b)+f(1,0,0)r(1-y)(1-b)\\ &\;+f(0,1,1)(1-r)yb+f(1,0,1)r(1-y)b\\ &\;+f(1,1,0)ry(1-b)+f(1,1,1)ryb \end{align}$$ donde el subíndice $c$ denota un valor en las esquinas.

Ahora quiere resolver el problema contrario. Quiere una función $f^{-1}: \textrm{RGB} \rightarrow \textrm{RYB}$ que toma un triplete $(R,G,B)$ a un triplete $(r,y,b)$ . Me parece que un problema más fácil de resolver es realizar el mismo proceso que hicieron los autores del artículo enlazado: encontrar los valores RYB de todos los colores en las esquinas de un cubo RGB e interpolar entre ellos. Esto te dará una función $F: \textrm{RGB} \rightarrow \textrm{RYB}$ que puede no ser exactamente igual a $f^{-1}$ pero es de esperar que se acerque lo suficiente a lo que necesitas.

$$\begin{align} \textrm{RGB}&\rightarrow\textrm{RYB}\\ F(0,0,0)&=?\\ F(0,0,1)&=?\\ F(0,1,0)&=?\\ F(0,1,1)&=?\\ F(1,0,0)&=(1,0,0)\\ F(1,0,1)&=?\\ F(1,1,0)&=(0,1,0)\\ F(1,1,1)&=(0,0,0)\\ F(R,G,B)&=F(0,0,0)(1-R)(1-G)(1-B)+F(0,0,1)(1-R)(1-G)B\\ &\;+F(0,1,0)(1-R)G(1-B)+F(1,0,0)R(1-G)(1-B)\\ &\;+F(0,1,1)(1-R)GB+F(1,0,1)R(1-G)B\\ &\;+F(1,1,0)RG(1-B)+F(1,1,1)RGB. \end{align}$$

La tarea que queda es rellenar esos espacios en blanco. Yo recomendaría codificar $f$ en algo como Mathematica y encontrar los valores $(r,y,b)$ donde $f(r,y,b)=(R_c,G_c,B_c)$ para los valores de las esquinas del cubo RGB. A continuación, establezca $F(R_c,G_c,B_c)=(r,y,b)$ para los valores que acaba de encontrar. Buena suerte.

3voto

Este es un tema antiguo, pero lo pongo para futuras referencias, por si alguien lo necesita.

He buscado los valores de RYB correspondientes a los colores de las esquinas de un cubo RGB (la ? en la respuesta de Flavin más arriba). Mi proceso fue:

  1. implementar la conversión RYB a RGB de Gosset et al (es decir, lo que hizo Tamàs y la primera parte de la respuesta de Flavin). Esto me da valores RGB que son fácilmente digeridos por cualquier función de análisis de color y pueden ser mostrados en pantalla.
  2. Define los colores de las esquinas del cubo RGB.
  3. Para cada esquina, encuentra el color más cercano en el espacio RYB utilizando:
    • una métrica de diferencia de color perceptiva. He probado CIEDE2000 y CMC l:c Mientras que el CIEDE2000 se considera generalmente superior, el CMC l:c permite ponderar el croma más que la luminancia, lo que dio mejores resultados porque lo que designamos como "color" suele estar más relacionado con el croma.
    • o bien la búsqueda en una tabla de colores calculada con la función definida en (1) aplicada a una cuadrícula de valores R, Y y B, o bien la minimización numérica de la diferencia de color parametrizada por los componentes R,Y,B (he utilizado el algoritmo de Nelder-Mead). Ambos dieron resultados muy similares.
  4. Asigna el triplete RYB a cada esquina.

Entonces podría realizar la conversión de RGB a RYB, calculando cada componente por interpolación trilineal en este cubo, exactamente como lo define Flavin más arriba.

Las advertencias:

  • He cambiado el color RYB más oscuro, comparado con el de Gosset et al, por el negro puro, para que al menos el blanco y el negro estén completamente definidos en cada modelo;
  • varios colores son las esquinas del cubo RGB no tienen un buen equivalente en el espacio RYB.

Estas son las tablas con las que terminé:

RYB a RGB modificado de Gosset et al

RYB   000     100     010     110     001     101     011     111
    white     red  yellow  orange    blue  purple   green   black
R       1       1       1       1   0.163     0.5       0       0
G       1       0       1     0.5   0.373       0    0.66       0
B       1       0       0       0     0.6     0.5     0.2       0

RGB a RYB

RGB   000     100     010     110     001     101     011     111
    black     red   green  yellow    blue magenta turquoi.  white
R       1       1       0       0       0   0.309       0       0
Y       1       0       1       1       0       0   0.053       0
B       1       0   0.483       0       1   0.469   0.210       0

y aquí hay una representación de los colores en las esquinas del cubo RGB (fila superior) y las mejores coincidencias en el espacio RYB (fila inferior): Coincidencia de RGB a RYB

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X