5 votos

¿Cómo calcular el color que ve un ojo humano al mirar un espectro de luz?

Tengo que hacer una presentación sobre colorantes en la clase de Química (grado 12, avanzado) y quiero escribir un programa que calcule y visualice los colores de algunas moléculas simples.

Lo que necesito es una fórmula para calcular el color visible (por ejemplo, los valores RGB del color que se vería igual que el espectro dado).

Debería poder manejar tanto líneas espectrales monocromáticas como espectros amplios. (¿por ejemplo, con integrales o algo parecido?)

3voto

zeldredge Puntos 6025

Tratando de romper mi mal hábito de responder en comentarios, ahora pongo mis cosas anteriores aquí abajo. Como mencioné, me baso en gran medida en una publicación de blog que hice hace unos años, trabajando en el color del cielo. Tenía un espectro y quería un color. Como mencioné anteriormente, no puedes simplemente tomar un espectro y obtener una longitud de onda equivalente, solo algunos colores son llamados colores "espectrales". Estos son los que están en el arcoíris.

Para obtener un color a partir de un espectro, necesitamos saber cómo responden los ojos a la luz entrante. Como sabes, tienes tres tipos de células, con diferentes regiones de sensibilidad. Digamos que tenemos una función $f_i(\omega)$ que caracteriza la respuesta a una frecuencia $\omega$, siendo 1 el máximo y 0 el mínimo. La intensidad del espectro está dada por $I(\omega)$. Entonces podemos hablar sobre la respuesta total: $$ R_i = \frac{\int_0^\infty \mathrm{d} \omega \ f_i(\omega) I(\omega)}{\int_0^\infty \mathrm{d} \omega \ f_i(\omega)} $$ Lo he normalizado de tal manera que un espectro plano te da 1. Puedes ver que hay dos formas de obtener una gran respuesta: tener algo de intensidad en un lugar donde la respuesta $f$ es fuerte, o mucha intensidad en un lugar donde no lo es. Ahora, el subíndice está porque habrá tres de estos: $R_1, R_2, R_3$, uno para cada célula. Ahora puedes llevar esas respuestas (que se corresponden aproximadamente con rojo, azul y verde, pero no realmente) y ejecutarlas a través de una matriz que la transforma en la base RGB de la imagen de la computadora. Ahora, la computadora define los colores con un cuarto parámetro, el brillo. Para obtener esto a partir de un espectro, necesitarías conocer la intensidad medida real y mucho más sobre cómo responde el ojo, pero con el valor RGB puedes obtener una gama de colores que se corresponde con lo que podría parecer el espectro.

Ahora, específicamente preguntaste cómo se obtendría esto a partir de una serie de líneas espectrales. La respuesta aquí es que el espectro es cero en la mayoría de lugares, pero muy fuerte en otros. En este caso, la estructura matemática que quieres se llamaría funciones delta de Dirac, pero podemos ser un poco más simples. Básicamente, la integral se convertirá en una suma de todas las líneas espectrales discretas: $$ R_i = \frac{\sum_{j} \ f_i(\omega_j) I(\omega_j)}{\int_0^\infty \mathrm{d} \omega \ f_i(\omega)} $$ Aquí ahora estamos sumando sobre cada línea presente (etiquetada $j$), y simplemente obteniendo ese valor de lo que era anteriormente la integral, pero aún normalizado de la misma manera. Ahora podrías usar la función de intensidad para ajustar la fuerza de las diversas líneas espectrales. Una vez que tengas los valores de respuesta, procedes exactamente como en el caso continuo.

1voto

The_Vinz Puntos 177

No podrás obtener el color correcto de las bandas estrechas porque están fuera del espacio de color RGB. Sin embargo, puedes obtener su tono correcto.

Necesitas funciones de coincidencia de color (por lo general usamos las CMFs de 1931 2° de la CIE, revisa en línea... o aquí bajo la categoría de CMFs http://www.cvrl.org/)

Las CMFs multiplicadas por tu espectro, luego sumadas, te darán las proporciones de primarios X, Y, Z que coinciden con el color para un observador humano.

Una vez que tengas esto, puedes escalar tus resultados y convertir de XYZ a sRGB, por ejemplo (o cualquier otro sistema RGB que desees), la conversión se explica aquí:

XYZ2sRGB

Para escalar correctamente tus valores XYZ, te recomiendo obtener una "lectura blanca" usando solo solvente para tu espectrofotómetro. El valor Y de esta lectura será tu referencia blanca para escalar los otros valores XYZ.

Para obtener buenos tonos para las bandas estrechas que caen fuera del espacio de color sRGB, puedes convertir a CIE LCH y reducir C* hasta que caigas dentro del espacio de color RGB.

Ver aquí: XYZ2LAB >> LAB2LCH

XYZ 2 LCH

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