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

StackOverflow https://stackoverflow.com/questions/687261

  •  22-08-2019
  •  | 
  •  

Вопрос

Говорят, что при преобразовании из RGB в оттенки серого следует применять определенные веса к каналам R, G и B.Эти веса равны:0.2989, 0.5870, 0.1140.

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

Если вы столкнетесь с "линейным" и "нелинейным" 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 / гамма)) (пуристы щелкают языком) но здесь я опущу '.

Яркость на ЭЛТ-дисплее пропорциональна 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, но близки;придерживайтесь x ^ gamma для первого прохода.)

Наконец - то,

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

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

Другие советы

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

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

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

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

ПРИМЕЧАНИЕ:Следующий код предполагает 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
        }

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

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

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

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

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

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

Линейный свет3 спектральные веса для sRGB (и Rec709) являются:

Rлин * 0,2126 + Глин * 0,7152 + Bлин * 0.0722 = Y

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top