Перетворення RGB в масштаб сірого / інтенсивності


129

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

Кажуть, що причиною цього є різне сприйняття / чутливість людини до цих трьох кольорів. Іноді також говорять, що це значення, використовувані для обчислення сигналу NTSC.

Однак я не знайшов хорошого посилання на це в Інтернеті. Яке джерело цих значень?

Дивіться також ці попередні питання: тут і тут .


26
Так. Я весь час програмую на значення RGB. Застосування значень "реального світу" до цих обчислень дуже важливо, якщо ви хочете, щоб ваша програма вартувала її солі.
Ніл N

1
Багато програмістів можуть не байдуже й обчислювати "неправильні" зображення сірого кольору, але я це роблю.
ypnos

6
Я погоджуюся, що це кодування пов'язане - викликає цікаву та актуальну проблему, якщо ви кодуєте графіку. +1, як я хотів би дізнатися відповідь сам
Cruachan

6
RGB є програмування пов'язані. Це так само, як пов'язане з програмуванням, як розбір рядків дати. Як перетворення тексту "true" в булеве значення.
Ніл N

Відповіді:


87

Конкретні цифри у запитанні є від CCIR 601 (див. Посилання Вікіпедія нижче).

Якщо ви конвертуєте RGB -> відтінки сірого з дещо різними числами / різними методами, ви не побачите великої різниці на звичайному екрані комп'ютера при нормальних умовах освітлення - спробуйте.

Ось ще кілька посилань на колір взагалі:

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

Видатний веб-сайт Брюса Ліндблома

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

Яскравість на дисплеї CRT пропорційна RGBlin = RGB ^ гамма, тому 50% сірого на CRT є досить темним: .5 ^ 2.2 = 22% максимальної яскравості. (РК-дисплеї складніші; крім того, деякі відеокарти компенсують гаму.)

Щоб отримати міру легкості, викликаної L*RGB, спочатку розділіть RGB на 255 і обчисліть

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

Це Yв кольоровому просторі XYZ; це міра кольорової "яскравості". (Справжні формули - це не зовсім x ^ гама, але близькі; дотримуйтесь х ^ гами для першого проходу.)

Нарешті,

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

"... прагне до сприйняття однаковості [і] тісно відповідає людському сприйняттю легкості." - Колірний простір лабораторії Вікіпедії


8
Y = 0,2126 * R + 0,7152 * G + 0,0722 * B - Вікіпедія ( en.wikipedia.org/wiki/Grayscale )
iamantony

14

Я виявив, що ця публікація посилається на відповідь на попереднє подібне питання. Це дуже корисно:

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

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


9

Ось якийсь код у 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
        }

2
0,3 0,6 0,11 не додавати до 1. Вікіпедія, здається, пропонує 0,30 0,59 0,11.
damix911

Щоправда, але єдиним результатом їх не додавання до 1 буде дуже незначна зміна інтенсивності. Запропонований метод 0,25,0,5,0,25 додає до 1, але це не має значення, якщо б не. Це оптимізація, тому відмова від невеликої точності є розумним компромісом.
twerdster

2
@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, а потім застосувати правильні коефіцієнти.
Миндекс

Якщо ви перебуваєте в ситуації , коли розрив занадто дорого, наближення , яке використовує один множення зі зрушеннями і додає це: 0.11111111 * ((G + (G<<1) + R) <<1) + B). Це еквівалентно (2*R+6*G+B) / 9)або 0.222 R + 0.666 G + 0.111 B. Перш ніж перейти до виробництва, порівняйте точну формулу для різних тестових випадків.
ToolmakerSteve


6

Перегляньте поширені питання про кольори, щоб отримати інформацію про це. Ці значення походять від стандартизації значень RGB, які ми використовуємо на своїх дисплеях. Насправді, відповідно до кольорових запитань щодо кольорів, використовувані значення застаріли, оскільки це значення, використовувані для оригінального стандарту NTSC, а не сучасні монітори.


3

Яке джерело цих значень?

"Джерелом" розміщених коефіцієнтів є специфікації 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. Я обговорюю це в іншій відповіді тут.


-2

Ці значення різняться від людини до людини, особливо для людей, що мають кольорові сліпи.


-4

чи все це дійсно необхідно, людське сприйняття та ЕЛТ проти РК буде різнитися, але інтенсивність RGB ні, чому б L = (R + G + B)/3і ні, і встановити новий RGB на L, L, L?


3
Просте усереднення всіх трьох праймерів R, G, B трактує їх як перцептивно рівні, що не стосується системи зору людини.
Білл Фет
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.