+-------------------------------------------------+ | Adaptivní metody vytváření palety (heuristické) | +-------------------------------------------------+ Adaptivní metody kvantování využívají informace z obrazu a vytvářejí paletu přímo na míru. Prakticky všechny adaptivní metody pracují s výčtem všech barev a jejich histogramem. Množinu reprezentantů barev obrazu tvoří všechny RGB vektory, které se ve vstupním obraze objevují alespoň jednou. Při vytváření takové tabulky reprezentantů je vhodné současně vytvářet histogram, tj. sčítat četnost výskytů každé z barev. Výpočet histogramu a reprezentantů v šedotónových obrazech je jednoduchý, jednoprůchodový proces s konstantní složitostí [22]. V případě barev v RGB prostoru je problém složitější. Zdánlivě nejjednodušším řešením je vytvoření velkého statického pole s konstantní složitostí přístupu k položkám. V rozlišení True Color však toto pole musí obsahovat 256^3, tedy přibližně 16 milionů barev, a to je i v dnešní době ještě poměrně mnoho. Podobným řešením s podobnými problémy je lineární spojový seznam s lineární složitostí přístupu. Proto se většinou uvažuje jen vyšších 5 bitů každé složky barvy a předpokládá se, že by tyto barvy stejně byly zaokrouhleny do jediné položky ve výsledné paletě [1]. Jiným přístupem je uchovávat informace jen o těch barvách, které se v obrázku vyskytují alespoň jednou. V praxi se totiž ukazuje, že pokud není obrázek specielně vygenerován, zdaleka neobsahuje všechny barvy. Z barev, které jsou opravdu v obrázku obsaženy je možno vytvořit strukturu octree [8][21], známou spíše z prostorové počítačové grafiky. Octree je strom, kde každý uzel má maximálně 8 synů. Kořen potom reprezentuje celý RGB prostor, jeho synové dělí tento prostor na 8 podkrychlí s poloviční velikostí hrany a toto dělení dále pokračuje až do hloubky 8. V listech jsou již uloženy informace o počtech výskytů jednotlivých barev. Na počátku generování histogramu existuje jen kořen a během procházení obrázku přibývají podle potřeby synové a listy. Přístupová doba k položkám octree je konstantní (s koeficientem 8) a paměťové nároky jsou přijatelné, protože většina uzlů v octree je prázdná. Způsob uchování barev v octree je ilustrován na obrázku . Nejjednodušší metoda adaptivního kvantování je nazývána popularity algorithm [1][2]. Vybírá jednoduše 256 nejčastěji se vyskytujících barev a předpokládá, že málo zastoupené barvy v obrázku není třeba uvažovat a můžeme je nahradit nejbližší barvou z nové palety. Setřídíme tedy sestupně histogram podle četnosti a paletu pak tvoří jen prvních N barev (N je počet barev v paletě, většinou v rozsahu 16 - 256). Tento algoritmus v kombinaci se snížením barevné hloubky (předkvantování) histogramu na 5 nebo 6 bitů může docela dobře fungovat [18], pro zašumělé nebo nekontrastní obrázky má však velmi špatné výsledky [1]. Pokud jsou v obraze objekty a pozadí plynule mění barvu, je většina barev spotřebována na pozadí, které má vysokou četnost výskytu. Další metoda je nazývána metoda akumulativního histogramu [20]. Snaží se vytvářet skupiny z barev, které mají zhruba stejný počet výskytů a dohromady zastupují přibližně 1/N pixelů v obrázku. Pracujeme opět nad sestupně setříděným histogramem RGB vektorů, který se snažíme adaptivně rozdělit na N dílů tak, aby byl součet četností v každém z dílů shodný. Procházíme tedy histogram od nejčetnějších barev a sčítáme počty výskytů. Jestliže překročíme hodnotu 1/N počtu pixelů v obrázku, skupina získala dostatek potenciálních zájemců o tuto barvu a provedeme dělení. Barvy ve skupině sloučíme a tím získáme jednu z položek v paletě. Barvy slučujeme obyčejným aritmetickým průměrem nebo váženým průměrem dle jejich četností. Tento postup opakujeme až do konce histogramu. Proces slučování je kritickým bodem metody. Skutečnost, že barvy mají podobnou četnost nemusí znamenat, že jsou si barevně blízké. Tato metoda má podobné vlastnosti jako popularity algoritmus a často zkresluje původní barvy. Má uspokojivé výsledky pro obrazy s menším počtem kontrastních barev. Myšlenka předchozího algoritmu byla úspěšně převzata metodou uvedenou v [8]. Uvedený proces neprovádíme pro globální histogram barev, ale pro každou z os RGB krychle zvlášť a dělíme osy na nestejné úseky. Jde tedy o adaptivní, ale přesto ortogonální dělení RGB krychle, podobně jako u uniformní palety. Vytvoříme tedy nejprve histogramy barev pro jednotlivé složky R, G a B. Pak opět vypočítáme hodnotu, po jejímž překročení dojde k dělení, ale s tím, že dělíme ve třech složkách, tudíž musí být součin počtu úseků jednotlivých os menší nebo roven N. Nyní pro každý histogram provedeme dělení na skupiny jako v předchozí metodě a v závěrečné fázi do palety uložíme všechny kombinace vypočtených hodnot z jednotlivých os. Tato metoda má lepší výsledky než neadaptivní dělení krychle, přitom zachovává některé výhody jako uspořádání a znalost nejbližšího souseda. Přejímá samozřejmě i nevýhody, například v možné redundanci barev. Další metoda vytváření palety barev vychází přímo z octree reprezentace histogramu a bývá označována octree quantization [8]. Tato metoda vychází z myšlenky, že barvy, které jsou v RGB krychli blízko u sebe, jsou si podobné a je možno je sloučit. Algoritmus má mnoho variant, jedna z nich nejprve vytvoří octree histogram pro celý obrázek, což bylo popsáno výše. V dalším se využívá vlastnosti, že každý rodič má maximálně 8 potomků. Všechny originální barvy jsou uloženy v listech takového stromu, tedy v hloubce 8. Ve vyšších vrstvách jsou uloženy uzly, které mohou být jakousi aproximací těchto originálních barev, protože je vlastně na vyšší úrovni zastupují. Postupně tedy redukujeme listy a pak i uzly stromu, přičemž barvy vhodně slučujeme, například váženým průměrem dle četností. Postup opakujeme tak dlouho, dokud celkový počet barev v octree nebude menší nebo roven N. Tento velice efektivní algoritmus má problémová místa ve volbě uzlů vhodných pro redukci barev a v přílišné rychlosti redukce, protože redukujeme až 8 barev najednou. Pro redukci barev jsou například vhodné ty uzly, které obsahují barvy s nejmenší četností, protože ty nebudou v obrázku tolik podstatné. Rychlost redukce barev můžeme odstranit postupným slučováním pouze dvojic barev. Octree algoritmus je hojně používaný [2][8] i pro svou malou paměťovou náročnost. Jiná varianta totiž nevytváří předem octree histogram pro celý obraz, ale zařazuje barvy postupně do stromu tak dlouho, dokud jejich počet nepřesáhne stanovené M. Jakmile se načítá M+1 barva, dochází k automatické redukci barev ve stromě. Tento postup zaručuje, že v paměti je nejvýše M barev zároveň. Nevýhodou tohoto postupu je závislost na pořadí příchozích barev, proto se doporučuje jiné než sekvenční zpracovávání obrazu, například pomocí fraktálních vyplňovacích křivek [16][9][15]. Nejrozšířenější metodou pro adaptivní vytváření palety je algoritmus nazvaný median cut algorithm [1][2]. Tento algoritmus je používán i ve shlukové analýze [23]. Snaží se najít a ohraničit v RGB prostoru shluky podobných barev, které dostanou přidělenu jednu položku v paletě. Nejprve vytvoříme opsaný kvádr (bounding box) kolem všech bodů (reprezentantů) v RGB krychli. V tomto kvádru jsou tedy nejprve všechny barvy obsažené v obrázku. Potom tento kvádr rozdělíme podél osy s největší velikostí hrany na dva podkvádry. Tento krok se nazývá cut. Nově vzniklé RGB kvádry zmenšíme tak, aby opět tvořily opsané kvádry pro všechny body (barvy) v nich obsažené a zařadíme je do seznamu ohraničujících kvádrů. Potom opět vybereme z této množiny kvádr s největší stranou R, G nebo B a celý proces opakujeme tak dlouho, dokud nerozdělíme RGB krychli na N částí. Nakonec barvy, obsažené v jednotlivých ohraničujících kvádrech sloučíme, například váženým průměrováním, a vypočtené barvy uložíme do palety. Uvedený algoritmus má své modifikace, a to zejména ve způsobu dělení RGB kvádru a ve způsobu výběru nového kandidáta na dělení. Nejčastější způsob dělení kvádru je podle mediánu, tj. střední hodnoty seznamu barev, uspořádaného podle barvy ve které se dělí [1], pro některé případy je ale lepší obyčejné dělení v geometrickém středu. Při dělení lze též uvažovat četnosti rozdělovaných barev a vytvářet stejně početné kvádry. Dělení v mediánu je nazýváno median cut a dělení v geometrickém středu geometric cut. Uvedený algoritmus je ve variantě geometrického dělení velmi rychlý a má velmi dobré výsledky [1]. Další metody kvantování barev jsou založeny na shlukové analýze, podobně jako předchozí algoritmus. Asi nejlepší rozdělení RGB krychle na daný počet oblastí (clustering) uvádí [9]. Provádí rozdělení RGB krychle na shluky podle Voronoiova diagramu v prostoru [12]. Tento diagram rozdělí krychli na N konvexních buněk, obsahujících shluky barev, jejichž sloučením získáme hledanou paletu. Nevýhoda tohoto algoritmu je v časové a paměťové náročnosti. Pro vytváření diagramu v RGB prostoru si tento algoritmus alokuje (pokud nepoužijeme doporučené předkvantování barev) celý barevný prostor 16 milionů barev, který pak geometricky zpracovává. Jiné metody používají přímo metody shlukové analýzy založené na statistických metodách [23]. Jedna z metod například náhodně vyplní paletu, kterou potom v dalších krocích vylepšuje. Pro každou barvu obsaženou v histogramu nalezne nejbližší barvu z této vytvářené palety a barvu v paletě touto barvou z histogramu modifikuje. Modifikace se provádí váženým průměrováním těchto dvou barev, váha jádra (položky v paletě) se tedy postupně zvyšuje. Pokud v první fázi máme dvě barvy těsně vedle sebe, v průběhu váhových modifikací se od sebe pravděpodobně vzdálí. Tento proces lze provést buď jen jednou, nebo několikrát po sobě, měl by poměrně rychle konvergovat. V principu jde o opačný postup, než provádí median cut, který se snaží RGB prostor dělit na kvádry a dodatečně vypočítat jádro. výheň