Barevná konverze u kompresních algoritmů Rozdíl ve způsobu, jakým počítač reprezentuje barvy, a jak je vnímá naše oko, je také důvodem pro určitou transformaci do barevného modelu, ve kterém je vhodné komprimovat obrazové údaje. Grafické adaptéry pracují s barvami ve známém aditivním modelu RGB, který je vhodný pro zobrazování na CRT a LCD displejích, protože odpovídá principu práce se světlem. Lidské oko vnímá barvy trochu jinak, než v RGB. Sítnice našeho oka obsahuje buňky citlivé na světlo, kterým se říká tyčinky a čípky. Tyčinky jsou citlivé pouze na achromatickou (nebarevnou) složku světla a je jich velmi velké množství (udávají se hodnoty 75, 130 a 150 milionů). Druhý typ buněk - čípky - vnímají spektrální rozdíl buďto od červené do zelené, nebo od modré do žluté. Je jich sice okolo 7 milionů, ale oproti počtu tyčinek je to velice málo. Problém modelu RGB z hlediska komprese dat je v tom, každá složka barvy obsahuje informaci o světlosti (luminance) a barvě (chrominance), takže když ztrátově zkomprimujeme barevný obraz (dělá se to pro každou barevnou složku zvlášť), dochází k velkým optickým ztrátám na kvalitě. Stačí totiž lehce pozměnit jednu ze složek RGB a rozdíl hned poznáme. Lidské oko je navíc různě citlivé na různé barvy. Nejméně citliví jsme na červenou, potom na modrou a nejcitlivější na zelenou. Evoluce seznala tuto konfiguraci za nejvýhodnější. Privilegium vnímat barvy mnoho živočichů nemá, barvocitlivé buňky se vyvinuly až velice pozdě (pes vidí černobíle, komár se specializuje na infračervené spektrum kvůli tělesnému teplu). Podobně vyvinuté oko jako člověk má například chobotnice. Řešení problému najít optimální barevný model pro lidské oko souvisí s příchodem barevné televize. Černobílá TV chytá signál o určité frekvenci, ze kterého potom podle amplitud zjišťuje, jak světlé mají být ty které bodíky na obrazovce. Když se zaváděla barevná televize, bylo třeba zajistit zpětnou kompatibilitu s černobílou, tzn. že i na černobílé TV mělo být možné bez problémů chytat barevný signál. Černobílý signál nese pouze informaci o luminanci, což bylo třeba zachovat (pro černobílé televize), jenom se k němu "přimodulovaly" dvě barvonosné složky. Barevné televize dokáží z takového kompozitního signálu "vytáhnout" barvu a přidat ji k dominantní luminanci, kdežto černobílé televize si barvy prostě nevšímají a zobrazují černobílý obraz. Kdyby se vysílalo na třech frekvencích pro R,G a B, pak by jste na černobílé TV mohli chytnout pouze jednu barevnou složku a tak by byl obraz velice tmavý a jiné barvy, které neobsahují naladěnou složku by vůbec nebyly vidět. Kýžený barevný model se nazývá YIQ, v počítačové grafice je však častější podobný model YUV (jinak také YCbCr), kde Y znamená luminanci, U (Cb) zastoupení modré a V (Cr) zastoupení červené barvy. Zelená zastoupena není, pro získání celé barvy stačí tři složky a zelená se při zpětném převodu snadno dopočítá (odebereme modrou a červenou od světlonosné složky). Stejně jako u televize, nejdůležitější informace je obsažena ve složce Y a U,V lze přitom omezit. Obrázek je jakoby rozložen do tří samostatných obrázků (dále rovin), které reprezentují jednotlivé složky. První věc, kterou kompresní program dělá, je převod původního obrázku do modelu YUV. Roviny U a V se potom mohou zmenšit na 50% své původní velikosti, přičemž je zaručeno, že si rozdílu vůbec nepovšimneme. Převod z RGB do YUV Na vstupu je tedy bitmapa ve formátu RGB a provádí se převod do YUV, podle vztahů:
Y = 0.299 R + 0.587G + 0.114 B U = −1.687 R − 0.3313G + 0.5 B + 128 V = 0.5 R − 0.4187G − 0.0813B + 128 Výstupní hodnoty je třeba zaokrouhlit, opět se však budou pohybovat v mezích intervalu <0,255>, takže pro uložení obrázku v YUV do paměti stačí naplnit jednotlivé složky barevného pixelu: R,G a B. Zkušební program provede rozložení obrázku do jednotlivých složek, které zobrazí zvlášt jako tři obrázky. Aby byly tyto obrázky pro srovnání rovnocenné, zobrazují hodnoty Y, U a V ve stupních šedi.
Vlevo nahoře je původní barevný obrázek a ve spodní části jsou zleva doprava vyobrazeny postupně separátní obrázky pro složky Y, U, V. Jejich složením by vzniknul opět původní obrázek. První obrázek ve spodní části zachycuje všechny důležité detaily, tedy světlost každého bodu. Obsahuje to, čeho si naše oko všímá nejvíc. Druhý obrázek zastupuje modrou složku a třetí červenou. Všechny barevné elementy původního obrázku zde jsou různě světlé podle toho, kolik červené nebo modré obsahují, takže achromatické barvy, tedy černobílý pásek a bílý puntík tu nejsou vidět vůbec. Program YUV separate provádí konverzi: Podvzorkování (subsampling) Podvzorkování je obvykle první krok při kompresi rastrové grafiky, u něhož je ztráta kvality neznatelná. První prográmek vytvořil tři bitmapy, které obsahovaly separátní obrazy, všechny tři mají stejné rozlišení (300x300 pixelů), ale dvě z nich jsou pro naše oko zbytečně velké. Barvonosné bitmapy bychom mohli nyní zkomprimovat pro nižší kvalitu výstupu a vyšší kompresní poměr, ale v praxi se to nepoužívá, protože stačí obrázky s barvou zmenšit. Této technice se říká podvzorkování. Komprimují se tři bitmapy, ale dvě jsou zmenšené. Po dekompresi dojde k opačnému procesu, tedy navzorkování a zpětné konverzi do modelu RGB. Podvzorkování je nevratný proces. Jakmile jsou barvonosné bitmapy zmenšené, obsahují méně informace a můžeme je tedy zvětšit na stejné kvalitativní úrovni. Můžeme si pomoci třeba vyhlazením, ale to naše oko v konečném efektu ani nepozná. Toto je důvod, proč se JPEG nehodí k opakovanému komprimování. Pokud nepoužíváme nástroj k tomu určený a jednoduše opakovaně ukládáme JPEG, je to jako opakovaně vkládat papír do kopírky, ze které právě vyšel, nebo kopírovat zkopírovanou magnetofonovou pásku. Výsledek bude stále horší a horší. Víme tedy, že barvonosné složky mohou být výrazně omezeny. Jak moc? Existuje několik různých variant podvzorkování pro JPEG (celkem je však YUV formátů opravdu nepřeberné množství - v principu však jde vždy o to samé). V praxi se používají tzv. planar a packed formáty. Planar formáty dělí obrázek vždy do tří rovin, které se kódují zvlášť. Subsampling probíhá rovněž v těchto rovinách. Packed formáty skládají složky YUV do jedné roviny, přičemž k podvzorkování dochází právě při tomto skládání. Jak u planar, tak u packed formátů se nehovoří o pixelech, ale o tzv. makropixelech, což je seskupení více pixelů (obvykle 4). Struktura makropixelu potom určuje formát. YYYY UUUU VVVV Takto vypadá uspořádání pixelů v planar formátu a takto může vypadat ve formátu packed: YUYV YUYV YUYV Různá citlivost oka na barvy se de-facto používá u digitálních kamer a fotoaparátů. Ty obsahují různé druhy čipů, které obsahují elementy citlivé na červenou, zelenou a modrou barvu. Existují už nové typy těchto čipů (např. SuperCCD), které spojí vše do jednoho elementu, ale u klasických CCD snímačů vypadá uspořádání elementů takto:
Každý čtvereček o velikosti 2x2 elementy, který vyberete, obsahuje 2 elementy citlivé na zelenou, a po jednom elementu citlivém na červenou a modrou barvu. Podobné je to v YUV packed formátu až na to, že makropixely jsou vždy 4 pixely vedle sebe a namísto RGB schématu je zde YUV:
Šedá zde představuje světlonosnou složku a modrá s červenou potom složky barvonosné. Mnohem používanější je však planar formát, kterým se budeme dále zabývat. Jeho uspořádání je prosté:
V následující ukázce je znázorněn rozklad obrázku zkomprimovaného metodou JPEG na složky YUV stejným způsobem, jako to dělal první program. Všimněte si, jak jsou barvonosné bitmapy potlačeny co do kvality:
Navzorkování Poslední program demonstruje podvzorkování a následné navzorkování. Ukazuje rozdíl mezi originálním obrázek a tím, který zabírá z paměťového hlediska jen 3/4 originálu (protože bitmapy jsou zmenšené na polovinu). Při podvzorkování se z každé čtveřice pixelů (čtvereček 2x2 pixely) udělá průměr co do složek U a V, takže docílíme zmenšení (ale bylo by možné tři okolní pixely ignorovat a brát jen každý čtvrtý - je to však nepatrné a tedy i zbytečné zrychlení). Při navzorkování se každý bod zmenšené bitmapy rozkopíruje na čtyři místa. Program ještě dopočítá diferenční (rozdílový) obrazec. Ten ukazuje barevné odchylky mezi jednotlivými pixely. Barevná odchylka se vypočítá sečtením absolutních hodnot rozdílů jednotlivých barevných složek. Převod YUV do RGB Pro správné zobrazení je třeba provést zpětný převod do RGB. K tomu se používají tyto vztahy:
R = Y + 1.402 (V − 128 )
G = Y − 0.34414 (U − 128 ) − 0.71414 (V − 128 ) B = Y + 1.772 (U − 128 )
Zde si už musíte dát pozor, protože výstupní hodnoty mohou být menší než 0 nebo větší než 255, což je třeba ošetřit podmínkou.
Zkušební program tedy kromě „předkompresní přípravy“ obrázku zobrazí rozdíl mezi originálem a navzorkovanými složenými bitmapami. Tento rozdíl je velice malý a neznatelný. Proto je diferenční obrazec konstruován na přechodu modrá-červená, kde červená znamená největší rozdíly. Ty musely být rovněž umocněny, aby byly dostatečně patrné.
Vlevo nahoře je originál, vedle potom rekonstruovaný obraz a diferenční obrazec. Je prakticky nemožné všimnout si rozdílu. Trochu znát je například na atmosferické modři, která je na rekonstruovaném obrázku trochu světlejší, ale to je dáno zaokrouhlováním. Rozdíly jsou schovány tam, kde byly původně ostré barevné přechody, protože právě ty byly zmenšením a zvětšením rozmazány, ale pro nás jsou na úrovni 2x2 pixely neviditelné. Vespod jsou potom tři bitmapy, ze kterých byl druhý obrázek složen, dvě jsou již zmenšené. YUV formáty Je možné použít různé typy planar uskladnění obrazové informace. Nejpoužívanější YUV formáty se označují číselně a jsou to tyto: ● ● ● ●
YUV YUV YUV YUV
4:4:4 4:2:2 4:1:1 4:2:0
Čím vyšší čísla, tím vyšší kvalita. U první formátu 4:4:4 nedochází k žádnému podvzorkování. U formátu 4:2:2 se separátní obrázky dvakrát zmenší v horizontálním smyslu, u 4:1:1 jde o totéž, jenom se zmenší čtyřikrát a u posledního formátu 4:2:0 se dělí výška i šířka separátních bitmap dvěma, z každé čtveřice pixelů je tedy jen jeden barvonosný. Další zmenšování se už nedoporučuje, protože by se nepříjemně projevilo ve výstupním obrázku. Barvy by se začaly doslova "rozlézat" a celý obrázek by budil dojem ledabyle zpracované omalovánky. Podívejte se na výsledky při různých vzorkovacích faktorech: …vlevo je výstup při čistém podvzorkování, vpravo totéž s použitím interpolace (kubický konvoluční filtr) v programu Imaging Shop:
originál (Baboon), 512x512 pixelů
faktor 4
faktor 8
faktor 16
faktor 32 Vynucování barvy Jednou z mých inovací v programu je použití barvy u obrázků, které jsou velikostí téměř srovnatelné s černobílými. Dvě složkové bitmapy lze totiž stlačit do jedné a na té pak ještě provést podvzorkování, čímž se informace o barvě opravdu minimalizuje a tedy se i sníží kvalita obrázku. Ukázkový program YUV force color tuto úpravu provádí. Problém spočívá v tom, že každý pixel "sbalené" bitmapy může mít 256 hodnot, které musí obsáhnou různé stavy složek U a V. Je tedy potřeba vytvořit vhodnou paletu, kterou jsem nazval progresivní, protože obsahuje všechny možné přechody mezi barvonosnými složkami. Takto vypadá struktura progresivní palety, která zachycuje všechny přechody mezi kombinacemi barvonosných složek:
Upřesnění
přechod 1+42 (Cb = 0)
přechod 1+42 (else)
přechod 1+42 (Cb = 255)
Barva
Indexy čisté barvy / přechodů
žádná
0
0,0; 0,6; 0,12; ... 0,252
1-42
červená
43
0,255; 6,249; 12,243; ...252,3
44-85
modrá
86
255,0; 255,6; 255,12; ...255,252
87-128
fuchsiová
129
přechod 1+42 (Cb = Cr)
255,255; 249,249; 243,243; ...3,3
130-171
žádná přechod 42 (Cr = 0)
6,0; 12,0; ... 252,0
172-213
modrá bez přechodu
--červená
přechod 42 (Cr = 255)
6,255; 12,255; ...252,255
214-255
fuchsiová
(256)
Červená i modrá složka jsou zde rovnocenné, pro vylepšení by bylo možné přidat trochu červené, protože na tu je oko citlivější než na modrou. Kroky při přechodech jdou po šesti, takže technika vynucování barvy není vhodná pro jemné barevné přechody. První ukázkový program vytvoří progresivní paletu a po rozkladu na model YUV vyhledá pro složky U, V konkrétní index v paletě. Vzniklá kompozitní bitmapa je náchylná na změny hodnot pixelů, protože ty se pak projeví markantnější změnou barvy v rekonstruovaném obrazu.
Ve spodním řádku jsou složkové bitmapy a pod nimi potom progresivní paleta. V horní řadě je zleva originál, kompozitní bitmapa a rekonstruovaný obraz. Za cenu ztráty na barvě stačí kódovat jen jednu kompozitní bitmapu místo dvou, na druhou stranu na ni musí být komprese trochu šetrnější. Podvzorkování kompozitní bitmapy Další program spojuje možnosti podvzorkování a vynucování barvy. Výsledky mohou být u některých obrázků uspokojivé, ale hodí se spíše pro webové aplikace, reklamu atp., kde jde spíš o to, zda jde o tu kterou barvu a na odstínu nezáleží. Výsledky při různém vzorkovacím faktoru:
originál (Baboon), 512x512 pixelů
vlevo: obrázek s vynucenými barvami, vpravo: s použitím interpolace shora dolů: faktor 2, 4, 16 a 32