Как получить длину волны пикселя, используя RGB? - PullRequest
17 голосов
/ 28 апреля 2011

У меня есть проект, который классифицирует цвет пикселя.Будь то красный, фиолетовый, оранжевый или просто любой цвет в цветовом круге.Я знаю, что существует более 16 миллионов цветовых комбинаций для пикселей.Но я смог прочитать веб-страницу, на которой написано, что я могу сделать свой проект, используя длины волн цветаПожалуйста, дайте мне формулу для расчета длины волны, используя значения RGB.Спасибо!

Ответы [ 4 ]

8 голосов
/ 28 апреля 2011

Чистый цвет имеет длину волны (у любого одноцветного светодиода будет определенная длина волны).Красный, зеленый и синий имеют диапазон длин волн.Однако, когда вы делаете цвет RGB, вы складываете эти длины волн вместе, что НЕ даст вам новую длину волны.Глаз не может отличить желтый цвет, состоящий из одной длины волны, от красного и зеленого (как работает глаз).Я бы порекомендовал почитать теорию цвета

http://en.wikipedia.org/wiki/RGB_color_model

6 голосов
/ 28 апреля 2011

Хорошо RGB для монитора отображает на 3 независимых уровня красного, зеленого и синего, поэтому (в основном) присутствуют 3 различных длины волны любого одного воспринимаемого цвета.

НО Если вы можете преобразовать значение цвета RGB в его эквивалентный HSL, то часть H (оттенок) является доминирующим цветом, поскольку длина волны достигает , если вы готовы игнорируйте насыщенность (думайте о ней как о белизне).

Исходя из того, что вы можете приблизительно доминировать длину волны цвета на основе значения H.

Красный свет имеет длину волны приблизительно 630–740 нм, Фиолетовый - приблизительно 380–450 нм.

5 голосов
/ 28 апреля 2011

Определение длины волны немного сложно, и, как отметил Гоблин, не всегда возможно (другой пример - это цвет, получаемый смешиванием равного количества красного и синего света. У фиолетового нет единой длины волны).

Но если все, что вы хотите сделать, это определить цвет по имени, то модель HSV будет хорошей для использования.HSV - это Hue (где цвет находится вокруг цветового круга), Saturation (количество цвета в отличие от оттенка черного / серого / белого) и Value (насколько яркий или темный пиксель).В этом случае Hue, вероятно, именно то, что вы хотите.

Если вы используете язык .NET, то вам повезло.См. Метод Color.GetHue , который делает всю работу за вас.

В противном случае см. HSV в Википедии для получения более подробной информации.

По существу, если у вас есть R, G и B как числа с плавающей точкой в ​​диапазоне от 0,0 до 1,0 (вместо целых чисел от 0 до 255, например), то:

M = max(R, G, B)
m = min(R, G, B)
C = M-m

if M = m then H' is undefined (The pixel is some shade of grey)
if M = R then H' = (G-B)/C mod 6
if M = G then H' = (B-R)/C + 2
if M = B then H' = (R-G)/C + 4

При преобразовании RGB в HSV вы затем умножаете H 'на60 градусов, но для ваших целей H ', вероятно, хорошо.Это будет число от 0 до 6 (почти).0 красный (как 6).1 - желтый, значения от 0 до 1 затенены между красным и желтым.Так что 0.5 будет оранжевым.Важные ориентиры:

0 - Red
1 - Yellow
2 - Green
3 - Cyan
4 - Blue
5 - Purple
6 - Red (again)

Надеюсь, что помогает.

0 голосов
/ 23 августа 2013

http://en.wikipedia.org/wiki/Visible_spectrum

Это возможно. Смотри выше. Серый фон, видимо, облегчает. Вы можете получить что-то подобное самостоятельно и даже улучшить его. Но сделать это точно будет стоить больших долларов. Вам понадобится эксперт по колориметрии, откалиброванный монитор и среда просмотра (поскольку доминирующая длина волны вашего пикселя означает лишь то, какую монохроматическую длину волны он приближает на калиброванном мониторе в откалиброванной среде просмотра). Все это будет несколько тысяч долларов. Работа, выполненная по вышеуказанной ссылке, показанной в Википедии, не кажется такой точной, но, вероятно, это то, что вы хотите.

...