Преобразование RGB в оттенки серого / интенсивность

129

Говорят, что при преобразовании из RGB в оттенки серого к каналам R, G и B должны применяться определенные веса. Эти веса: 0,2989, 0,5870, 0,1140.

Говорят, что причиной этого является разное человеческое восприятие / чувствительность к этим трем цветам. Иногда также говорят, что это значения, используемые для вычисления сигнала NTSC.

Однако я не нашел хорошей ссылки на это в сети. Каков источник этих ценностей?

См. Также эти предыдущие вопросы: здесь и здесь .

ypnos
источник
26
Да, это так. Я все время занимаюсь программированием значений RGB. Применение «реальных» значений к этим вычислениям очень важно, если вы хотите, чтобы ваше приложение было достойным внимания.
Neil N,
1
Многим программистам может быть все равно, и они вычисляют «неправильные» изображения в оттенках серого, но я считаю.
ypnos
6
Я согласен, что это связано с кодированием - вызывающе интересная и актуальная проблема, если вы пишете графику. +1, поскольку я сам хотел бы знать ответ
Cruachan
6
RGB является программирование связаны. Это так же связано с программированием, как и парсинг строк даты. Как преобразование текста «истина» в логическое значение.
Neil N,

Ответы:

87

Конкретные числа в вопросе взяты из CCIR 601 (см. Ссылку на Википедию ниже).

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

Вот еще несколько ссылок по цвету в целом:

Википедия Luma

Выдающийся веб-сайт Брюса Линдблума

глава 4 о цвете в книге Колина Уэра «Визуализация информации», isbn 1-55860-819-2; эта длинная ссылка на Ware на books.google.com может работать, а может и не работать

cambridgeincolor : отличные, хорошо написанные «учебники о том, как получать, интерпретировать и обрабатывать цифровые фотографии с использованием визуально-ориентированного подхода, при котором концепция важнее процедуры»

Если вы столкнетесь с «линейным» или «нелинейным» RGB, вот часть моей старой заметки по этому поводу. Повторяю, на практике большой разницы не увидишь.


RGB -> ^ гамма -> Y -> L *

В науке о цвете обычные значения RGB, такие как html rgb (10%, 20%, 30%), называются «нелинейными» или с поправкой на гамму . «Линейные» значения определяются как

Rlin = R^gamma,  Glin = G^gamma,  Blin = B^gamma

где гамма 2.2 для многих ПК. Обычные RGB иногда записываются как R 'G' B '(R' = Rlin ^ (1 / gamma)) (пуристы щелкают языком), но здесь я опущу '.

Яркость на ЭЛТ-дисплее пропорциональна RGBlin = RGB ^ гамма, поэтому 50% серого на ЭЛТ довольно темное: 0,5 ^ 2,2 = 22% от максимальной яркости. (ЖК-дисплеи более сложные; кроме того, некоторые видеокарты компенсируют гамму.)

Чтобы получить меру яркости, вызванную L*из RGB, сначала разделите RGB на 255 и вычислите

Y = .2126 * R^gamma + .7152 * G^gamma + .0722 * B^gamma

Это Yцветовое пространство XYZ; это мера «яркости» цвета. (Настоящие формулы не совсем x ^ gamma, но близки; придерживайтесь x ^ gamma для первого прохода.)

В заключение,

L* = 116 * Y ^ 1/3 - 16

«... стремится к единообразию восприятия [и] полностью соответствует человеческому восприятию легкости». - Цветовое пространство Wikipedia Lab

Денис
источник
8
Y = 0,2126 * R + 0,7152 * G + 0,0722 * B - Википедия ( en.wikipedia.org/wiki/Grayscale )
iamantony
14

Я обнаружил, что эта публикация ссылается на предыдущий аналогичный вопрос. Это очень полезно:

http://cadik.posvete.cz/color_to_gray_evaluation/

Он показывает «тонны» различных методов для создания изображений в оттенках серого с разными результатами!

ypnos
источник
9

Вот код в c для преобразования rgb в оттенки серого. Реальный вес, используемый для преобразования RGB в оттенки серого, составляет 0,3R + 0,6G + 0,11B. эти веса не являются абсолютно критическими, так что вы можете с ними играть. Я сделал их 0,25R + 0,5G + 0,25B. Это дает немного более темное изображение.

ПРИМЕЧАНИЕ. В следующем коде предполагается, что 32-битный пиксельный формат xRGB

unsigned int *pntrBWImage=(unsigned int*)..data pointer..;  //assumes 4*width*height bytes with 32 bits i.e. 4 bytes per pixel
unsigned int fourBytes;
        unsigned char r,g,b;
        for (int index=0;index<width*height;index++)
        {
            fourBytes=pntrBWImage[index];//caches 4 bytes at a time
            r=(fourBytes>>16);
            g=(fourBytes>>8);
            b=fourBytes;

            I_Out[index] = (r >>2)+ (g>>1) + (b>>2); //This runs in 0.00065s on my pc and produces slightly darker results
            //I_Out[index]=((unsigned int)(r+g+b))/3;     //This runs in 0.0011s on my pc and produces a pure average
        }
twerdster
источник
2
0,3 0,6 0,11 не прибавлять к 1. Википедия, кажется, предлагает 0,30 0,59 0,11.
damix911
Верно, но единственным результатом того, что они не прибавляют к единице, будет очень небольшое изменение интенсивности. Предлагаемый метод 0,25,0,5,0,25 действительно добавляет к 1, но это не имело бы значения, если бы это не было. Это оптимизация, поэтому отказ от малейшей точности - разумный компромисс.
twerdster
2
@twerdster Ни один из наборов коэффициентов неверен. .3, .6, .11 - это старый стандарт NTSC, а не sRGB / Rec709 (который используется в Интернете и на большинстве компьютеров). И ваши 0,25,0,5,0,25 не являются разумным компромиссом - B составляет всего 7% яркости, вы ошибаетесь на 347%. Коэффициенты для sRGB / r709 (после линеаризации): Rlin * 0,2126 + Glin * 0,7152 + Blin * 0,0722 = Y Эти спектральные веса получены из спектрального восприятия человека. Вы не можете просто ввести любые числа, которые хотите для удобства, и надеяться на точность. Вам нужно линеаризовать sRGB, а затем применить правильные коэффициенты.
Myndex
Если вы находитесь в ситуации , когда разрыв слишком дорого, приближение , которое использует один умножение со сдвигами и добавляет это: 0.11111111 * ((G + (G<<1) + R) <<1) + B). Это эквивалентно (2*R+6*G+B) / 9)или 0.222 R + 0.666 G + 0.111 B. Перед запуском в производство сравните с точной формулой для различных тестовых случаев.
ToolmakerSteve
6

Проверьте цвет Справку для получения информации по этому вопросу . Эти значения получены из стандартизации значений RGB, которые мы используем в наших дисплеях. На самом деле, согласно FAQ по цвету, используемые вами значения устарели, поскольку они являются значениями, используемыми для исходного стандарта NTSC, а не для современных мониторов.

Брайан Кэмпбелл
источник
3

Каков источник этих ценностей?

«Источником» размещенных коэффициентов являются спецификации NTSC, которые можно увидеть в Rec601 и « Характеристики телевидения» .

«Конечным источником» являются эксперименты CIE 1931 года по восприятию цвета людьми. Спектральный отклик человеческого зрения неоднороден. Эксперименты привели к взвешиванию трехцветных значений на основе восприятия. Наши колбочки L, M и S 1 чувствительны к длинам световых волн, которые мы определяем как «красный», «зеленый» и «синий» (соответственно), что и является источником трехцветных основных цветов. 2

Спектральные веса linear light 3 для sRGB (и Rec709):

R лин * 0,2126 + G лин * 0,7152 + B лин * 0,0722 = Y

Они относятся к цветовым пространствам sRGB и Rec709, которые предназначены для представления компьютерных мониторов (sRGB) или мониторов HDTV (Rec709), и подробно описаны в документах ITU для Rec709, а также BT.2380-2 (10/2018)

СНОСКИ (1) Колбочки - это клетки сетчатки глаза, определяющие цвет.
(2) Однако выбранные трехцветные длины волн НЕ находятся на «пике» каждого типа конуса - вместо этого трехцветные значения выбираются так, чтобы они стимулировали один тип конуса значительно сильнее, чем другой, то есть разделение стимулов.
(3) Перед применением коэффициентов необходимо линеаризовать значения sRGB. Я обсуждаю это в другом ответе здесь.

Myndex
источник
-2

Эти ценности варьируются от человека к человеку, особенно для людей с дальтонизмом.

Боб Пикл
источник
-4

действительно ли все это необходимо, человеческое восприятие и ЭЛТ по сравнению с ЖК-дисплеем будут различаться, но интенсивность RGB не изменится. Почему бы L = (R + G + B)/3и нет, и установить новый RGB на L, L, L?

user1668969
источник
3
Простое усреднение всех трех основных цветов R, G, B рассматривает их как перцепционно равные, что не относится к системе человеческого зрения.
Bill Feth