Преобразование RGB в оттенки серого / интенсивность - PullRequest
113 голосов
/ 26 марта 2009

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

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

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

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

Ответы [ 8 ]

78 голосов
/ 27 марта 2009

Конкретные цифры в вопросе взяты из 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

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

10 голосов
/ 27 марта 2009

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

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

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

9 голосов
/ 30 января 2011

Вот некоторый код в 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
        }
6 голосов
/ 26 марта 2009

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

6 голосов
/ 26 марта 2009

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

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

1 голос
/ 20 мая 2019

Что является источником этих значений?

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

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

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

R Лин * 0,2126 + Г Лин * 0,7152 + В Лин * 0,0722 = Y

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

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

0 голосов
/ 13 марта 2018

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

0 голосов
/ 18 августа 2016

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

...