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

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

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

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

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


person ypnos    schedule 26.03.2009    source источник
comment
Да. Я все время программирую по значениям RGB. Применение реальных значений к этим вычислениям очень важно, если вы хотите, чтобы ваше приложение было достойным внимания.   -  person Neil N    schedule 26.03.2009
comment
Многим программистам может быть все равно, и они вычисляют неправильные изображения в градациях серого, но я это делаю.   -  person ypnos    schedule 26.03.2009
comment
Я согласен, что это связано с кодированием - вызывающе интересная и актуальная проблема, если вы кодируете графику. +1 так как я сам хотел бы знать ответ   -  person Cruachan    schedule 26.03.2009
comment
RGB может иметь отношение к программированию, но я не вижу здесь никаких вопросов по программированию. Я бы сказал, что это больше вопрос о том, как работают люди.   -  person Seb    schedule 26.03.2009
comment
RGB связан с программированием. Это так же связано с программированием, как и анализ строк даты. Как преобразование текста в логическое значение.   -  person Neil N    schedule 27.03.2009
comment
CCIR 601. См. Этот фрагмент википедии: en.wikipedia.org/wiki /   -  person David Jones    schedule 12.02.2014
comment
@ypnos Я новичок в обработке изображений и хотел бы знать, как те веса, которые вы упомянули, используются для расчета окончательного значения RGB в градациях серого для пикселя. Ссылки будут оценены ..   -  person pnizzle    schedule 06.03.2014


Ответы (9)


Конкретные числа в вопросе взяты из 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 для многих ПК. Обычные R G B иногда записываются как R 'G' B '(R' = Rlin ^ (1 / gamma)) (пуристический щелчок языком), но здесь я опущу '.

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

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

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

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

Наконец-то,

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

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

person denis    schedule 27.03.2009
comment
Y = 0,2126 * R + 0,7152 * G + 0,0722 * B - Википедия (en.wikipedia.org/wiki/ Оттенки серого) - person iamantony; 03.02.2013
comment
Привет, могу ли я получить эквивалентное панхроматическое изображение, отображая цветное изображение RGB как изображение в градациях серого? Или может ли составляющая интенсивности изображения в формате HIS, преобразованного из RGB, представлять панхроматическое изображение? - person emberbillow; 18.04.2021
comment
@emberbillow, существует много способов сопоставления цвета с оттенками серого, некоторые из которых иногда могут работать достаточно хорошо. Какую программу вы используете, читали ли вы ее документацию? Вы можете просто попробовать и посмотреть на нескольких ваших тестовых изображениях. - person denis; 18.04.2021
comment
Спасибо, Денис. Я не использую программное обеспечение. Я просто сталкиваюсь с этим вопросом, когда читаю определение панхроматического изображения. Известно, что яркость пикселя на панхроматическом изображении приблизительно соответствует отражательной способности поверхности земли. Следовательно, поскольку цветное изображение RGB покрывает приблизительно интервал полосы видимого света, я предполагаю, что его формат в градациях серого может представлять панхроматическое изображение. Я не уверен, правильно ли я понимаю. - person emberbillow; 18.04.2021
comment
@enberbillow, stackoverflow предназначен для вопросов по программному обеспечению и программированию, предпочтительно с примером. Попробуйте панхроматическую шкалу серого RGB IHS? - person denis; 18.04.2021

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

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

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

person ypnos    schedule 26.03.2009

Вот код в 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
        }
person twerdster    schedule 30.01.2011
comment
0,3 0,6 0,11 не прибавлять к 1. Википедия, кажется, предлагает 0,30 0,59 0,11. - person damix911; 13.01.2013
comment
Верно, но единственным результатом того, что они не прибавляют к единице, будет очень небольшое изменение интенсивности. Предлагаемый метод 0,25,0,5,0,25 действительно добавляет к 1, но это не имело бы значения, если бы это не было. Это оптимизация, поэтому отказ от малейшей точности - разумный компромисс. - person twerdster; 13.10.2016
comment
@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, а затем применить правильные коэффициенты. - person Myndex; 20.05.2019
comment
Если вы находитесь в ситуации, когда деление обходится слишком дорого, приближение, в котором используется однократное умножение со сдвигом и добавлением: 0.11111111 * ((G + (G<<1) + R) <<1) + B). Это эквивалент (2*R+6*G+B) / 9) или 0.222 R + 0.666 G + 0.111 B. Перед запуском в производство сравните с точной формулой для различных тестовых случаев. - person ToolmakerSteve; 27.11.2019

Вот статья о том, как были получены эти числа (или аналогичные):

https://web.archive.org/web/20160303201512/http://www.cis.rit.edu/mcsl/research/broadbent/CIE1931_RGB.pdf

person rmmh    schedule 26.03.2009

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

person Brian Campbell    schedule 26.03.2009

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

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

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

Спектральные веса линейного света 3 для sRGB (и Rec709) следующие:

R lin * 0,2126 + G lin * 0,7152 + B lin * 0,0722 = Y

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

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

person Myndex    schedule 20.05.2019

Начнем список, чтобы перечислить, как это делают разные программные пакеты. Вот хороший документ CVPR, который стоит прочитать.

FreeImage

#define LUMA_REC709(r, g, b)    (0.2126F * r + 0.7152F * g + 0.0722F * b)
#define GREY(r, g, b) (BYTE)(LUMA_REC709(r, g, b) + 0.5F)

OpenCV

nVidia Performance Primitives

Intel Performance Primitives

Matlab

nGray =  0.299F * R + 0.587F * G + 0.114F * B; 
person wcochran    schedule 24.03.2021

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

person Bob Pickle    schedule 18.08.2016

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

person user1668969    schedule 13.03.2018
comment
Простое усреднение всех трех основных цветов R, G, B рассматривает их как перцептивно равные, что не относится к системе человеческого зрения. - person Bill Feth; 11.06.2018