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

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

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

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

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

Ответ 1

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

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

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

Википедия Лума

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

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

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

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


RGB → ^ gamma → 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/гамма)) (пуристы щелкают языком), но здесь я опущу '.

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

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

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

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

Наконец,

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

"... aspires to perceptual uniformity [and] closely matches human perception of lightness." -- Wikipedia Lab color space

Ответ 2

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

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

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

Ответ 3

Вот какой код в 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
        }

Ответ 5

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

Ответ 6

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

"Источник" опубликованных коэффициентов - это спецификации 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), и подробно описаны в документах МСЭ для Rec709, а также BT.2380-2 (10/2018)

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

Ответ 8

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

Ответ 9

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