it-swarm.com.ru

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

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

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

Тем не менее, я не нашел хорошую ссылку для этого в Интернете. Каков источник этих ценностей?

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

113
ypnos

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

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

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

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

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

глава 4 о цвете в книге Колина Уэра "Визуализация информации", исбн 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 ^ гамма, поэтому 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

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

78
denis

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

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

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

10
ypnos

Вот некоторый код в 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
        }
9
twerdster

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

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

6
rmmh

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

6
Brian Campbell

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

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

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

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

Рлин * 0,2126 + Gлин * 0,7152 + Bлин * 0.0722 = Y

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

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

2
Myndex