Кто-нибудь знает какую-либо формулу для преобразования частоты света в значение RGB?
algorithm
language-agnostic
rgb
formula
approximation
Шауль Бер
источник
источник
Ответы:
Вот подробное объяснение всего процесса преобразования: http://www.fourmilab.ch/documents/specrend/ . Исходный код включен!
источник
Для ленивых парней (вроде меня) вот реализация на java кода, найденного в ответе @ user151323 (то есть просто простой перевод кода паскала, найденного в Spectra Lab Report ):
источник
Wavelength<=439
наWavelength<440
.Главная идея:
Шаги 1 и 2 могут отличаться.
Существует несколько функций сопоставления цветов, доступных в виде таблиц или аналитических приближений (предложенных @Tarc и @Haochen Xie). Таблицы лучше всего, если вам нужен точный результат.
Единого цветового пространства RGB не существует. Могут использоваться множественные матрицы преобразования и различные виды гамма-коррекции.
Ниже приведен код C #, который я недавно придумал. Он использует линейную интерполяцию по таблице «Стандартный наблюдатель CIE 1964» и матрицу sRGB + гамма-коррекцию .
Результат для диапазона 400-700 нм:
источник
Хотя это старый вопрос и уже получил несколько хороших ответов, когда я попытался реализовать такую функцию преобразования в своем приложении, меня не удовлетворили алгоритмы, уже перечисленные здесь, и я провел собственное исследование, которое дало мне хороший результат. Итак, я отправлю новый ответ.
После некоторых исследований я наткнулся на эту статью « Простые аналитические приближения к функциям согласования цветов CIE XYZ» и попытался применить представленный алгоритм кусочно-гауссовой подгонки с несколькими лепестками в своем приложении. В документе описаны только функции преобразования длины волны в соответствующие значения XYZ , поэтому я реализовал функцию преобразования XYZ в RGB в цветовом пространстве sRGB и объединил их. Результат фантастический, и стоит поделиться:
мой код написан на Java 8, но его несложно перенести на более ранние версии Java и другие языки.
источник
transfer
делал DoubleUnaryOperator (поэтому объяснение в моем предыдущем комментарии неверно), поэтому проверьте новый код.1.
всего 1, но тип будетdouble
вместоint
Вы говорите о преобразовании длины волны в значение RGB.
Посмотрите сюда, наверняка ответите на ваш вопрос. У вас есть утилита для этого с исходным кодом, а также некоторые пояснения.
WaveLengthToRGB
источник
Думаю, я мог бы дополнить свой комментарий официальным ответом. Лучший вариант - использовать цветовое пространство HSV - хотя оттенок представляет длину волны, это не однозначное сравнение.
источник
Я провел линейную аппроксимацию известных значений оттенков и частот (исключив красный и фиолетовый, потому что они настолько сильно расширяются в значениях частоты, что немного искажают вещи), и я получил грубое уравнение преобразования.
Это похоже на
частоту (в ТГц) = 474 + (3/4) (Угол оттенка (в градусах))
Я попытался осмотреться и посмотреть, придумал ли кто-нибудь это уравнение, но по состоянию на май 2010 года ничего не нашел.
источник
Способ 1
Это немного очищенная и протестированная версия @ haochen-xie для C ++ 11. Я также добавил функцию, которая преобразует значение 0 в 1 в длину волны в видимом спектре, которую можно использовать с этим методом. Вы можете просто поместить ниже в один файл заголовка и использовать его без каких-либо зависимостей. Эта версия будет поддерживаться здесь .
График цветов от 375 до 725 нм выглядит следующим образом:
Одна из проблем этого метода заключается в том, что он работает только в диапазоне 400-700 нм, а за пределами этого диапазона резко падает до черного. Другой вопрос - более узкий синий.
Для сравнения ниже приведены цвета из FAQ по Vision на maxmax.com:
Я использовал это для визуализации карты глубины, где каждый пиксель представляет значение глубины в метрах, и это выглядит следующим образом:
Способ 2
Это реализовано как часть библиотеки одного файла bitmap_image только для заголовков от Aeash Partow:
График длины волны 375-725 нм выглядит следующим образом:
Так что это более удобно при 400-725 нм. Когда я визуализирую ту же карту глубины, что и в методе 1, я попадаю ниже. Есть очевидная проблема с этими черными линиями, которые, как мне кажется, указывают на незначительную ошибку в этом коде, которую я не рассматривал более глубоко. Кроме того, в этом методе фиолетовый цвет немного уже, что снижает контраст для удаленных объектов.
источник
Спроецируйте CIExy длины волны в сторону белого D65 на гамму sRGB
источник