Формула для определения яркости цвета RGB - PullRequest
356 голосов
/ 27 февраля 2009

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

Ответы [ 18 ]

1 голос
/ 27 февраля 2009

RGB Значение яркости = 0,3 R + 0,59 G + 0,11 B

http://www.scantips.com/lumin.html

Если вы ищете, насколько близок белый цвет, вы можете использовать Евклидово расстояние от (255, 255, 255)

Я думаю, что цветовое пространство RGB заметно неоднородно по отношению к евклидову расстоянию L2. Унифицированные пространства включают CIE LAB и LUV.

1 голос
/ 27 февраля 2009

Пространство HSV должно помочь, см. Статью в википедии , в зависимости от языка, на котором вы работаете, вы можете получить преобразование библиотеки.

H - это оттенок, который представляет собой числовое значение цвета (то есть красный, зеленый ...)

S - насыщенность цвета, т. Е. Насколько она "интенсивная"

V - это «яркость» цвета.

1 голос
/ 11 марта 2017

Интересно, как были определены эти коэффициенты RGB. Я сам провел эксперимент и в итоге получил следующее:

Y = 0.267 R + 0.642 G + 0.091 B

Близко, но очевидно отличается от давно установленных коэффициентов МСЭ. Интересно, могут ли эти коэффициенты быть разными для каждого наблюдателя, потому что у всех нас может быть разное количество колбочек и палочек на сетчатке в наших глазах, и особенно соотношение между разными колбочками может отличаться.

Для справки:

МСЭ BT.709:

Y = 0.2126 R + 0.7152 G + 0.0722 B

ITU BT.601:

Y = 0.299 R + 0.587 G + 0.114 B

Я выполнил тест, быстро переместив маленькую серую полоску на ярко-красный, ярко-зеленый и ярко-синий фон и отрегулировав серый, чтобы он как можно больше смешался. Я также повторил этот тест с другими оттенками. Я повторил тест на разных дисплеях, даже на одном с фиксированным гамма-фактором 3,0, но для меня все выглядит одинаково. Более того, коэффициенты МСЭ буквально не соответствуют моим глазам.

И да, у меня, видимо, нормальное цветовое зрение.

0 голосов
/ 19 января 2016

Для ясности формулы, использующие квадратный корень, должны быть

sqrt(coefficient * (colour_value^2))

не

sqrt((coefficient * colour_value))^2

Доказательством этого является преобразование триады R = G = B в шкалу серого R. Это будет верно только в том случае, если вы возводите в квадрат значение цвета, а не коэффициент времени, равный временному коэффициенту. См. Девять оттенков серого

0 голосов
/ 24 февраля 2012

Эта ссылка подробно объясняет все, в том числе, почему эти константы множителя существуют до значений R, G и B.

Редактировать: здесь также есть объяснение одному из ответов (0,299 * R + 0,587 * G + 0,114 * B)

0 голосов
/ 27 февраля 2009

V 'HSV, вероятно, то, что вы ищете. MATLAB имеет функцию rgb2hsv, а ранее цитированная статья в Википедии полна псевдокода. Если преобразование RGB2HSV невозможно, менее точной моделью будет версия изображения в градациях серого.

0 голосов
/ 11 апреля 2017

Чтобы определить яркость цвета с помощью R, я конвертирую системный цвет RGB в системный цвет HSV.

В моем скрипте ранее я использовал системный код HEX по другой причине, но вы также можете начать с системного кода RGB с rgb2hsv {grDevices}. Документация здесь .

Вот эта часть моего кода:

 sample <- c("#010101", "#303030", "#A6A4A4", "#020202", "#010100")
 hsvc <-rgb2hsv(col2rgb(sample)) # convert HEX to HSV
 value <- as.data.frame(hsvc) # create data.frame
 value <- value[3,] # extract the information of brightness
 order(value) # ordrer the color by brightness
0 голосов
/ 27 февраля 2009

Пожалуйста, определите яркость. Если вы хотите узнать, насколько близок белый цвет, вы можете использовать Евклидово расстояние от (255, 255, 255)

...