¿Alguien sabe de alguna fórmula para convertir una frecuencia de luz a un valor RGB?
algorithm
language-agnostic
rgb
formula
approximation
Shaul Behr
fuente
fuente
Respuestas:
Aquí hay una explicación detallada de todo el proceso de conversión: http://www.fourmilab.ch/documents/specrend/ . ¡Código fuente incluido!
fuente
Para los perezosos (como yo), aquí hay una implementación en java del código que se encuentra en la respuesta de @ user151323 (es decir, solo una traducción simple del código pascal que se encuentra en Spectra Lab Report ):
fuente
Wavelength<=439
aWavelength<440
.Idea general:
Los pasos 1 y 2 pueden variar.
Hay varias funciones de combinación de colores, disponibles como tablas. o como aproximaciones analíticas (sugeridas por @Tarc y @Haochen Xie). Las tablas son mejores si necesita un resultado de precisión suave.
No hay un único espacio de color RGB. Matrices de transformación múltiple usarse y diferentes tipos de corrección gamma.
A continuación se muestra el código C # que se me ocurrió recientemente. Utiliza interpolación lineal sobre la tabla de "observador estándar CIE 1964" y matriz sRGB + corrección gamma .
Resultado para el rango de 400-700 nm:
fuente
Aunque esta es una pregunta antigua y ya recibe un puñado de buenas respuestas, cuando traté de implementar dicha funcionalidad de conversión en mi aplicación, no estaba satisfecho con los algoritmos que ya se enumeran aquí e hice mi propia investigación, lo que me dio un buen resultado. Así que voy a publicar una nueva respuesta.
Después de algunas investigaciones, encontré este artículo, Aproximaciones analíticas simples para las funciones de concordancia de color CIE XYZ , e intenté adoptar el algoritmo de ajuste gaussiano por partes de varios lóbulos introducido en mi aplicación. El documento solo describía las funciones para convertir una longitud de onda a los valores XYZ correspondientes , así que implementé una función para convertir XYZ a RGB en el espacio de color sRGB y los combiné. El resultado es fantástico y vale la pena compartirlo:
mi código está escrito en Java 8, pero no debería ser difícil portarlo a versiones inferiores de Java y otros lenguajes.
fuente
transfer
estaba haciendo DoubleUnaryOperator (por lo tanto, la explicación en mi comentario anterior no es correcta), así que verifique el nuevo código.1.
es solo 1 pero el tipo será endouble
lugar deint
Estás hablando de convertir de longitud de onda a un valor RGB.
Mira aquí, probablemente responda a tu pregunta. Tienen una utilidad para hacer esto con el código fuente, así como alguna explicación.
WaveLengthToRGB
fuente
Supongo que también podría seguir mi comentario con una respuesta formal. La mejor opción es utilizar el espacio de color HSV ; aunque el tono representa la longitud de onda, no es una comparación uno a uno.
fuente
Hice un ajuste lineal de valores de tono y frecuencias conocidos (eliminando el rojo y el violeta porque se extienden tanto en los valores de frecuencia que sesgan un poco las cosas) y obtuve una ecuación de conversión aproximada.
Va como
frecuencia (en THz) = 474 + (3/4) (Ángulo de tono (en grados))
Intenté mirar a mi alrededor y ver si a alguien se le ocurrió esta ecuación, pero no encontré nada en mayo de 2010.
fuente
Método 1
Esto está un poco limpiado y probado en la versión C ++ 11 de @ haochen-xie. También agregué una función que convierte el valor de 0 a 1 en una longitud de onda en el espectro visible que se puede usar con este método. Puede colocarlo a continuación en un archivo de encabezado y usarlo sin dependencias. Esta versión se mantendrá aquí .
La trama de colores de 375 nm a 725 nm se ve a continuación:
Un problema con este método es el hecho de que funciona solo entre 400-700 nm y, fuera de eso, cae bruscamente a negro. Otro problema es el azul más estrecho.
A modo de comparación, a continuación se muestran los colores de Vision FAQ en maxmax.com:
Usé esto para visualizar el mapa de profundidad donde cada píxel representa el valor de profundidad en metros y esto se ve a continuación:
Método 2
Esto se implementa como parte de la biblioteca de encabezado de archivo único bitmap_image de Aeash Partow:
El gráfico de longitud de onda de 375 a 725 nm se ve a continuación:
Entonces esto es más utilizable en 400-725nm. Cuando visualizo el mismo mapa de profundidad que en el método 1, me pongo a continuación. Hay un problema obvio de esas líneas negras que creo que indica un error menor en este código que no he examinado más a fondo. Además, las violetas son un poco más estrechas en este método, lo que provoca menos contraste para los objetos lejanos.
fuente
Proyecte el CIExy de la longitud de onda hacia el blanco D65 en la gama sRGB
fuente