Czy ktoś zna jakąś formułę konwersji częstotliwości światła na wartość RGB?
algorithm
language-agnostic
rgb
formula
approximation
Shaul Behr
źródło
źródło
Odpowiedzi:
Oto szczegółowe wyjaśnienie całego procesu konwersji: http://www.fourmilab.ch/documents/specrend/ . Zawiera kod źródłowy!
źródło
Dla leniwych facetów (takich jak ja), oto implementacja w Javie kodu znalezionego w odpowiedzi @ user151323 (czyli po prostu proste tłumaczenie kodu pascala znalezionego w raporcie Spectra Lab ):
źródło
Wavelength<=439
naWavelength<440
.Główny pomysł:
Kroki 1 i 2 mogą się różnić.
Istnieje kilka funkcji dopasowywania kolorów, dostępnych jako tabele lub jako przybliżenia analityczne (sugerowane przez @Tarc i @Haochen Xie). Tabele są najlepsze, jeśli potrzebujesz precyzyjnego wyniku.
Nie ma jednej przestrzeni kolorów RGB. Można zastosować wiele macierzy transformacji i różne rodzaje korekcji gamma.
Poniżej znajduje się kod C #, który niedawno wymyśliłem. Wykorzystuje interpolację liniową w tabeli „Standard obserwator CIE 1964” i macierz sRGB + korekcja gamma .
Wynik dla zakresu 400-700 nm:
źródło
Chociaż jest to stare pytanie i już dostaje kilka dobrych odpowiedzi, kiedy próbowałem zaimplementować taką funkcjonalność konwersji w mojej aplikacji, nie byłem zadowolony z wymienionych tutaj algorytmów i przeprowadziłem własne badania, które dały mi dobry wynik. Więc zamierzam opublikować nową odpowiedź.
Po kilku badaniach natknąłem się na ten artykuł, Simple Analytic Approximations to the CIE XYZ Color Matching Functions , i próbowałem zastosować w mojej aplikacji wprowadzony wielopłatkowy algorytm Gaussa. W artykule opisano tylko funkcje konwersji długości fali na odpowiednie wartości XYZ , więc zaimplementowałem funkcję konwersji XYZ na RGB w przestrzeni kolorów sRGB i połączyłem je. Wynik jest fantastyczny i warto się nim podzielić:
mój kod jest napisany w Javie 8, ale przeniesienie go na niższe wersje Javy i innych języków nie powinno być trudne.
źródło
transfer
robił DoubleUnaryOperator (stąd wyjaśnienie w moim poprzednim komentarzu nie jest poprawne), więc proszę sprawdzić nowy kod.1.
jest tylko 1, ale typ będziedouble
zamiastint
Mówisz o konwersji długości fali na wartość RGB.
Spójrz tutaj, prawdopodobnie odpowie na twoje pytanie. Masz narzędzie do robienia tego z kodem źródłowym, a także pewne wyjaśnienia.
WaveLengthToRGB
źródło
Myślę, że równie dobrze mógłbym uzupełnić swój komentarz formalną odpowiedzią. Najlepszą opcją jest użycie przestrzeni kolorów HSV - chociaż odcień reprezentuje długość fali, nie jest to porównanie jeden do jednego.
źródło
Zrobiłem liniowe dopasowanie znanych wartości odcieni i częstotliwości (pomijając czerwony i fioletowy, ponieważ rozciągają się one tak daleko w wartościach częstotliwości, że nieco wypaczają) i otrzymałem przybliżone równanie konwersji.
To idzie jak
częstotliwość (w THz) = 474 + (3/4) (Kąt odcienia (w stopniach))
Próbowałem się rozejrzeć i sprawdzić, czy ktoś nie wymyślił tego równania, ale nie znalazłem nic do maja 2010 roku.
źródło
Metoda 1
Jest to nieco oczyszczone i przetestowane w C ++ 11 wersji @ haochen-xie. Dodałem również funkcję, która konwertuje wartość 0 do 1 na długość fali w widmie widzialnym, która jest użyteczna w tej metodzie. Możesz po prostu umieścić poniżej w jednym pliku nagłówkowym i używać go bez żadnych zależności. Ta wersja będzie tutaj utrzymywana .
Wykres kolorów od 375nm do 725nm wygląda jak poniżej:
Problem z tą metodą polega na tym, że działa ona tylko między 400-700nm, a poza tym gwałtownie spada do czerni. Kolejną kwestią jest węższy niebieski.
Dla porównania poniżej znajdują się kolory z Vision FAQ na maxmax.com:
Użyłem tego do wizualizacji mapy głębi, gdzie każdy piksel reprezentuje wartość głębokości w metrach i wygląda to jak poniżej:
Metoda 2
Jest to zaimplementowane jako część biblioteki bitmap_image z pojedynczym nagłówkiem pliku przez Aeash Partow:
Wykres długości fali 375-725nm wygląda jak poniżej:
Więc jest to bardziej użyteczne w 400-725nm. Kiedy wizualizuję tę samą mapę głębokości, co w metodzie 1, otrzymuję poniżej. Istnieje oczywisty problem z tymi czarnymi liniami, które, jak sądzę, wskazują na drobny błąd w tym kodzie, któremu nie przyjrzałem się dokładniej. Również fiołki są nieco węższe w tej metodzie, co powoduje mniejszy kontrast dla odległych obiektów.
źródło
Projektuj CIExy długości fali w kierunku bieli D65 na gamę sRGB
źródło