Задать вопрос
@cicatrix
было бы большой ошибкой думать

Алгоритм перевода RGB-компонент в длину волны?

Здравствуйте, кто-нибудь может поделиться идеями, насчёт того, как можно перевести значения RGB-компонент цвета в длину ЭМ-волны и обратно?
Задача простая - задаётся длина волны, надо найти значения RGB, наиболее близко к нему подходящее. Ну и наоборот.
  • Вопрос задан
  • 1059 просмотров
Подписаться 2 Средний Комментировать
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Длина волны в RGB.
Взято из https://www.johndcook.com/wavelength_to_RGB.html
const w = 640 // Длина волны
let red, green, blue;

if (w < 380 || w > 781) {
  [red, gren, blue] = [0, 0, 0];
} else if (w < 440) {
  [red, green, blue] = [(440 - w) / 60, 0, 1];
} else if (w < 490) {
  [red, green, blue] = [0, (w - 440) / 50, 1];
} else if (w < 510) {
  [red, green. blue] = [0, 1, (510 - w) / 20];
} else if (w < 580) {
  [red, green, blue] = [(w - 510) / 70, 1, 0];
} else if (w < 645) {
  [red, green, blue] = [1, (645 - w) / 65, 0];
} else {
  [red, green, blue] = [1, 0, 0];
}

let factor;
if (w < 380 || w > 781) {
  factor = 0;
} else if (w < 420) {
  factor = 0.3 + 0.7 * (w - 380) / 40;
} else if (w < 701) {
  factor = 1.0;
} else {
  factor = 0.3 + 0.7 * (780 - w) / 80;
}

const gamma = 0.8;

const R = (red > 0 ? 255 * Math.pow(red * factor, gamma) : 0);
const G = (green > 0 ? 255 * Math.pow(green * factor, gamma) : 0);
const B = (blue > 0 ? 255 * Math.pow(blue * factor, gamma) : 0);

const color = `rgb(${R}, ${G}, ${B})`;
console.log(color); // rgb(255, 32.763138565028974, 0)
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
Тут не тег "физика" нужен, а "биология". С точки зрения физики - эта задача не имеет смысла, ну не соответствует набор интенсивности трех длин - длине какого-то другого цвета.

Это задача подобрать такую длину волны, которая стимулирует средний человеческий глаз так же, как набор из трех разной интенсивности. Тут надо знать спектры чусвтительности разных колбочек и оттуда уже плясать.

Еще надо помнить про специфику работы мониторов - эти самые числа в RGB задают квадратные корни интенсивности свечения разных пикселей.

Еще, возможно будет легче сначала преобразовать RGB в какой-нибудь YUV или HSL.
Ответ написан
@U235U235
Нужно преобразовать значение RGB в систему XYZ, затем на диаграмме xy (цветовой локус, CIE 1931) провести луч из точки белого (для заданого источника света A, C, D65...) через заданую точку xy. Точка пересечения луча с кривой спектральных цветов даст доминирующую длину волны. Для пурпурных цветов луч проводится в противоположную сторону. Обычно для них ставится штрих у лямбды. С програмной точки зрения можно использовать сплайны. Литература: Джадд, Вышецки. 614b2c0f414c6310716842.jpeg
Ответ написан
Комментировать
@caballero
Программист
R G B эти три длины волны только интенсивность разная.
в какую то одну длину оно не переводится
коричнового цвета в спектре например вообще не существует
Ответ написан
@AlexSku
не буду отвечать из-за модератора
Наоборот не получится.
См. значения волн по периметру фигуры:

%D0%A4%D0%B0%D0%B9%D0%BB:CIE1931xy_blank.svg
Ответ написан
Комментировать
dollar
@dollar
Делай добро и бросай его в воду.
Если цвет как бы чистый, т.е. светит на одной длине волны (и с одной конкретной частотой), то он будет соответствовать какому-то одному конкретному "цвету": либо R, либо G, либо B, либо что-то между ними. И если между, то глаз может вообще это не увидеть.

На этом принципе построены светодиодные лампы. Зачем тратить электричество на свет в том диапазоне, который не видно?

Естественный же свет - это обычно целый спектр. И RGB - это всего лишь 3 точки на нём (условно). Вот я набросал пример спектра:
spoiler
614b1f51996c6771307024.png

А теперь главный вопрос. Ну, предположим, мы смирились с тем, что из всего спектра нам известны всего 3 значения. В конце концов таково человеческое зрение, ничего не поделаешь. И нашли функцию преобразования к длине, то есть к единственному числу. Тогда как в таком случае из единственного числа снова получить три значения RGB? Никак.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы