Тема 3 - Цветови модели

Цветови модели (RGB, HSV, CMYK, YCrCb, CIELAB)


страницата се нуждае от дописване/преглеждане


Увод

Както знаете на екрана изображенията се показват чрез растер, т.е правоъгълна матрица от пиксели. Всеки пискел има свой собствен цвят. Това, което ще разгледаме в тази лекция са различните начини на задаване на цвят на даден пиксел, именно - цветовия модел. За пълнота ще споменем и не съвсем цветните модели

  • черно-бял. Обърнете внимание, че за разлика от черно-белите телевизори тук има САМО черно и бяло - т.е няма никакво сиво :)
    • възможни цветове - черен и бял
    • заемана памет: 1 бит. Всеки бит е единица (1) или нула (0) и съответства на черно / бяло (може и наобратно). Ако малко си поиграете с побитови операции ще постигнете този минималистичен размер. Някои стари дисплеи (може и на телефони) имат само един цвят при тях един пиксел се кодира точно в един бит - пести се доста памет.
  • полутонови. Това е еквивалента на черно-белите телевизори. Има всички цветове между бялото и черното. Т.е всички степени на сивото.
    • възможни цветове - всички степени на сивото
    • заемана памет: 1 байт1. В един байт се кодират 255 различни нюанса на сивото. За повечето употреби това е напълно достатъчно.
  • цветни. Тук нещата стават интересни
    • възможни цветове - всички2
    • заемата намет - 3 байта3. Обикновенно всеки цвят има 3 компоненти, като можем да смятаме, че 3те са от 0 до 255 и да ги кодираме в по един байт. (разбира се, тези 3 компоненти могат да значат различни неща. Виж по надолу).

Ще разгледаме най-основните начини за представяне на цвят и разбира се как от едно представяне да преминем към друго.

RGB

Най-известният начин е така нареченото RGB, съкратено от Red, Green, Blue. Както може да се досетите, трите компоненти, определящи даден цвят, са именно интензитетите на основните цветове (с каква сила основните цветове присъстват в дадения)


Всички останали цветове се получават от подходящо смесване на основните. Този начин е най-широко разпространен, мониторите използват точно това представяне, за да изобразят нещо. Всеки пиксел е всъщност 3 малки лампички - червена, зелена и синя. Тъй като в миналото не са си давали зор да правят голяма абстракция между хардуера и софтуера, то и програмистите са били принудени да използват този начин на задаване на цветове, освен всичко друго той не е чак толкова контра-интуитивен. Под "миналото" се има предвид "преди две седмици".rgb.gif cmyk.gif

CMYK

3те допълнителни цвята на RGB са Cyan, Magenta, Yellow (в приблизителен превод "светло синьо", "пурпурно" - нарича се и просто "магента", и "жълто"). В RGB те се получават така:
Cyan = Green + Blue
Magenta = Red + Blue
Yellow = Red + Green
Ако разсъждаваме в термините на RGB, черното обозначава липсата на всеки от трите основни цвята от RGB (т.е, ако трите цветни компонента - червена, зелена, синя - са нула, се получава черно, а ако са max - 255 или 1, зависи дали ги разполагаме в дискретния интервал [0, 255], или в реалния интервал [0, 1] - се получава бял).
Съществува цветова схема, в която циановото, магентата и жълтото, тези три допълнителни (за RGB) цвята са основни, а червеното, зеленото и синьото пък са допълнителни и се получават чрез смесването на първите три. Тази схема се нарича CMYK (Cyan, Magenta, Yellow, Black). Какво? К означава черно, ок? По-добре ли щеше да е, ако го бяха кръстили ЦМУБ?

CIELab

Както казахме по-рано RGB е възникнало поради чисто технически причини, зависещи от методологията на работа на мониторите. За добро или лошо, начинът по който работи компютърът не съвпада много с начина, по който разсъждава човекът. Ето затова възникнал въпросът за представяне на цветовете по някакъв по-добър, по-осезателен за човека начин. Било решено яркостта да бъде отделена като един от компонентите, а другите 2 да отговарят за цвета. Пресмятането на RGB цвят в L*a*b е 'нагласено'. Само погледнете цветовете в матрицата по-долу. Това нагласяне идва от факта, че RGB цвета по никакъв начин не отразява неговата яркост (lightness, brightness value) - един доста важен показател при дигитална обработка на изображения. Ето малко за значението на 3те компонента

L* яркост
а* тоново отношение между червеното и зеленото
b* тоново отношение между жълтото и синьото

Пресмятане

Първо, за всеки цвят трябва да определим $x, y, z$ по следния начин (приемаме, че цветовете RGB са представени с реално число от интервала [0, 1]):

(1)
\begin{pmatrix} x \\ y \\ z \end{pmatrix} = \begin{pmatrix} 0.412453 & 0.35758 & 0.180423 \\ 0.212671 & 0.71516 & 0.072169 \\ 0.019334 & 0.119193 & 0.950227 \end{pmatrix} \begin{pmatrix} R \\ G \\ B \end{pmatrix}

Стойностите на $x, y, z$ при белия цвят (т.е $R = G = B = 1$) са по-интересни за нас, бележим ги с $x_n, y_n, z_n$:

(2)
\begin{eqnarray} x_n &=& 0.958456 \\ y_n &=& 1 \\ z_n &=& 1.088754 \end{eqnarray}

Освен тези 3 числа, особено голям интерес е и числото $\gamma = 0.008856$. Защо - ще разберете след малко.
Сега вече дойде ред на пресмятането на самите компоненти ($L*, a*, b*$). То става по следните формули:

(3)
\begin{eqnarray} L* &=& \begin{cases} 116\dfrac{y}{y_n} - 16 & \frac{y}{y_n} > \gamma \\ 903.3\dfrac{y}{y_n} & \frac{y}{y_n} \le \gamma \end{cases}\\ f(z) &=& \begin{cases} \sqrt[3]{z} & z > \gamma \\ 7.887z + \frac{16}{116} & z \le \gamma \end{cases}\\ a* &=& 500\left[ f\left(\frac{x}{x_n}\right) - f\left(\frac{y}{y_n}\right)\right]\\ b* &=& 200\left[ f\left(\frac{y}{y_n}\right) - f\left(\frac{z}{z_n}\right)\right]\\ \end{eqnarray}

Какви са всички тези измислени константи? Какви са тези магически числа в стил 0.119193? Само истинските джедаи ще имат шанса да разберат, в края на обучението си.

HSV

Това представяне е най-известното в обработката на изображения. Компонентите му значат:

H Hue тон
S Saturation наситеност
V/B Brightness Value яркост

Последната буква понякога е V, понякога B. И двете отговарят за яркостта - няма разлика между самите модели. Изчисляването на H става по следния начин:

(4)
\begin{align} H = \mathrm{arctg} \left( \frac{a*}{b*} \right) \end{align}

Това, разбира се, е спрямо предходния цветови модел.
В пространството може да си мислим HSV като обърнат конус, в който сме разположили цветовете. H е ъгъл (има тригонометрична функция), V показва на какво разстояние сме от върха на конуса, S показва отношението между разстоянието от точката до височината на конуса и радиуса на сечението, перпендикулярно на основата през точката.

hsv

YCrCb

Американската телевизия не може да остане назад - затова си измисля собствена цветова схема за лично ползване. Основните и компоненти са

Y $0.299R + 0.587G + 0.114B$ яркост
Cr $0.713 (R - Y) + 128$ close to red - близост до червеното
Cb $0.564 (B - Y) + 128$ close to blue - близост до синьото
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License