Quelqu'un connaît-il une formule pour convertir une fréquence lumineuse en une valeur RVB?
algorithm
language-agnostic
rgb
formula
approximation
Shaul Behr
la source
la source
Réponses:
Voici une explication détaillée de l'ensemble du processus de conversion: http://www.fourmilab.ch/documents/specrend/ . Code source inclus!
la source
Pour les paresseux (comme moi), voici une implémentation en java du code trouvé dans la réponse de @ user151323 (c'est-à-dire juste une simple traduction du code pascal trouvé dans Spectra Lab Report ):
la source
Wavelength<=439
pourWavelength<440
.Idée générale:
Les étapes 1 et 2 peuvent varier.
Il existe plusieurs fonctions de correspondance des couleurs, disponibles sous forme de tableaux ou d'approximations analytiques (suggérées par @Tarc et @Haochen Xie). Les tableaux sont les meilleurs si vous avez besoin d'un résultat précis et précis.
Il n'y a pas d'espace colorimétrique RVB unique. De multiples matrices de transformation et différents types de correction gamma peuvent être utilisés.
Vous trouverez ci-dessous le code C # que j'ai trouvé récemment. Il utilise l'interpolation linéaire sur la table "CIE 1964 standard observer" et la matrice sRGB + correction gamma .
Résultat pour la gamme 400-700 nm:
la source
Bien que ce soit une vieille question et que j'obtienne déjà une poignée de bonnes réponses, lorsque j'ai essayé d'implémenter une telle fonctionnalité de conversion dans mon application, je n'étais pas satisfait des algorithmes déjà énumérés ici et j'ai fait mes propres recherches, ce qui m'a donné de bons résultats. Je vais donc publier une nouvelle réponse.
Après quelques recherches, je suis tombé sur cet article, Approximations analytiques simples des fonctions de correspondance des couleurs CIE XYZ , et j'ai essayé d'adopter l'algorithme d'ajustement gaussien par morceaux à plusieurs lobes dans mon application. Le document décrivait uniquement les fonctions permettant de convertir une longueur d'onde en valeurs XYZ correspondantes , j'ai donc implémenté une fonction pour convertir XYZ en RVB dans l'espace colorimétrique sRGB et les ai combinées. Le résultat est fantastique et mérite d'être partagé:
mon code est écrit en Java 8, mais il ne devrait pas être difficile de le porter vers des versions inférieures de Java et d'autres langages.
la source
transfer
que faisait DoubleUnaryOperator (donc les explications de mon commentaire précédent ne sont pas correctes), veuillez donc vérifier le nouveau code.1.
est juste 1 mais le type sera à ladouble
place deint
Vous parlez de la conversion d' une longueur d'onde en une valeur RVB.
Regardez ici, répondra probablement à votre question. Ils ont un utilitaire pour faire cela avec le code source ainsi que quelques explications.
WaveLengthToRGB
la source
Je suppose que je pourrais aussi bien faire suivre mon commentaire d'une réponse formelle. La meilleure option est d'utiliser l' espace colorimétrique HSV - bien que la teinte représente la longueur d'onde, ce n'est pas une comparaison un à un.
la source
J'ai fait un ajustement linéaire des valeurs de teinte et des fréquences connues (en supprimant le rouge et le violet parce qu'ils s'étendent si loin dans les valeurs de fréquence qu'ils faussent un peu les choses) et j'ai obtenu une équation de conversion approximative.
Cela va comme la
fréquence (en THz) = 474 + (3/4) (Angle de teinte (en degrés))
J'ai essayé de regarder autour de moi et de voir si quelqu'un a trouvé cette équation, mais je n'ai rien trouvé en mai 2010.
la source
Méthode 1
Ceci est un peu nettoyé et testé la version C ++ 11 de @ haochen-xie. J'ai également ajouté une fonction qui convertit la valeur 0 en 1 en une longueur d'onde dans le spectre visible qui est utilisable avec cette méthode. Vous pouvez simplement mettre ci-dessous dans un fichier d'en-tête et l'utiliser sans aucune dépendance. Cette version sera maintenue ici .
Le tracé des couleurs de 375 nm à 725 nm ressemble à ci-dessous:
Un problème avec cette méthode est le fait qu'elle ne fonctionne qu'entre 400-700 nm et en dehors de cela, elle tombe brusquement au noir. Un autre problème est le bleu plus étroit.
À titre de comparaison, voici les couleurs de la FAQ Vision sur maxmax.com:
Je l'ai utilisé pour visualiser la carte de profondeur où chaque pixel représente la valeur de profondeur en mètres et cela ressemble à ci-dessous:
Méthode 2
Ceci est implémenté dans le cadre de la bibliothèque d' en-tête de fichier unique bitmap_image par Aeash Partow:
Le graphique de longueur d'onde de 375 à 725 nm ressemble à ci-dessous:
Donc, c'est plus utilisable en 400-725nm. Lorsque je visualise la même carte de profondeur que dans la méthode 1, j'obtiens ci-dessous. Il y a un problème évident de ces lignes noires qui, je pense, indiquent un bogue mineur dans ce code que je n'ai pas examiné plus profondément. Les violettes sont également un peu plus étroites dans cette méthode, ce qui entraîne moins de contraste pour les objets éloignés.
la source
Projetez le CIExy de la longueur d'onde vers le blanc D65 sur la gamme sRGB
la source