Reprezentácia obrazu

Obraz je možné reprezentovať vo všeobecnosti viacerými spôsobmi. V počítačovej grafike, konkrétne v našom prípade budeme používať dvojrozmerný obraz bodov s obmedzenými rozmermi, matematicky definovaný ako karteziánsky súčin dvoch spojitých intervalov, ktoré vymedzujú rozsah obrazu. Formálne použijeme matematický model, ktorým je spojitá funkcia dvoch premenných – obrazová funkcia:

\(z = f(x, y)\),

ktorú môžeme napísať ako karteziánsky súčin:

\(f:\left ( \left \langle x_{min},x_{max} \right \rangle \times \left \langle y_{min},y_{max} \right \rangle\right ) \rightarrow H\)

Reálne čísla x a y sú súradnice bodu v dvojrozmernom obraze, ktorých funkcia nadobúda nejaké hodnoty z oboru hodnôt H. Oborom hodnôt môže byť akékoľvek reálne číslo vo forme jasu, intenzity nejakej jednej farby, avšak v našom prípade budeme potrebovať rovno tri hodnoty v jednom, konkrétne RGB zložky farby, červenú, zelenú a modrú.

Digitalizácia

Základný proces tvorby digitálneho obrazu je prechod od spojitej funkcie \(f(x, y)\) k diskrétnej funkcii \(I_{i,j}\). V počítačovej grafike sa najčastejšie pracuje s diskrétnymi hodnotami, kde obraz predstavuje raster zložený z obrazových bodov, tzv. pixelov. Digitalizácia pozostáva z dvoch krokov, z kvantovania a vzorkovania.

Kvantovanie

Prebieha v obore hodnôt obrazovej funkcie (uvedenej vyššie), ktoré sa rozdelia na intervaly, ktorým je pridelená jediná zástupná hodnota. Spôsob rozdelenia intervalov môže byť rovnomerný a nerovnomerný, pričom častejšie sa používa rovnomerné, pretože je jednoduchšie realizovateľné a aj rýchlejšie, ale na úkor presnosti rozloženia hodnôt meranej veličiny. Pri kvantovaní dochádza k strate informácie, tzv. kvantizačná chyba, čo sa prejavuje pri prechode farieb ako skok farby, kde pôvodne hladký farebný prechod je nahradený skokovou zmenou. Táto chyba sa odstraňuje čiastočne práve nerovnomerným rozložením hodnôt.

Vzorkovanie

Vzorkovaním spojitej funkcie rozumieme zaznamenávanie hodnôt – vzoriek, v dopredu daných intervaloch. Jednorozmernú funkciu získanú pravidelným vzorkovaním budeme označovať \(I_{i}\) a vzdialenosť dvoch vzoriek označíme \(\Delta x\). Spojitá funkcia môže byť definovaná na ľubovoľnom intervale. Vzorky budeme indexovať nasledujúcim spôsobom:

\(I_{i}=f(x_{0}+i \Delta x), i=0,1,…\)

Z uvedeného vyplýva, že čím hustejší počet bodov, teda menšie prírastky, tým presnejší popis obrazu. Aj tu teda môže dochádzať k strate informácie. Teoreticky dochádza k strate informácie vždy, pretože jedine spojitý obraz je úplný, bezchybný, zdrojový, a všetky ostatné manipulácie smerované k digitalizácii tento pôvodný obraz nejakým spôsobom oberajú o kompletnú informáciu. Prakticky je to dané stavu, ku ktorému sa chceme priblížiť natoľko, že rozdiel medzi zdrojovou kvalitou a aktuálnou bude veľmi podobný.

Podľa spôsobu akým zaznamenávame alebo snímame obraz môže byť vzorkovanie bodové (point sampling), kde je hodnota vzorky odsnímaná v jednom bode alebo vzorkovanie plošné (area sampling), kde hodnota vzorky sa určí snímaním zo všetkých hodnôt, napr. ako ich priemer:

\(I_{i}=\frac{1}{\Delta x} \int_{x_{0}+i \Delta x}^{x_{0}+(i+1) \Delta x} f(x)dt\)

Samozrejme, plošné vzorkovanie vyžaduje väčšiu výpočtovú náročnosť než vzorkovanie bodové. Výraz

\(\frac{1}{\Delta x}\)

pred integrálom reprezentuje vzorkovaciu frekvenciu, t.j. počet vzoriek za jednotku času [Hz], alebo na jednotku vzdialenosti [dpi]. Čím bude vyššia vzorkovacia frekvencia, teda čím bude väčší počet výsledných vzoriek, tým bude pamäťová náročnosť vyššia. Týmto spôsobom zaznamenáme detailnejší obraz, ale ako už bolo spomenuté stále sa budeme len približovať k zdrojovému spojitému obrazu, teda zrejme nikdy ho nereprezentujeme úplne presne.

Reprezentácia rastrového obrazu

V našom prípade potrebujeme vždy poznať hodnotu pixelu v každej súradnicovej osi, teda, x a y ako aj hodnotu, ktorú tento pixel reprezentuje. Ak bude každý pixel na obraze reprezentovaný jedným bitom, čiže číslom 0 alebo 1, tak takýto obraz sa nazýva monochromatický, čiernobiely.

Pomocou x-ovej a y-ovej súradnice sa dostaneme kdekoľvek na obraze a to stále rovnakým spôsobom, teda príslušnými indexami dvojrozmerného poľa. S definovaním farby máme viac možností. Ak priradíme pixelu 0 a 1, dostaneme čiernobiely obraz, tzn. že v mieste, kde chceme bielu farbu priradíme hodnote pixelu číslo 0 alebo v mieste, kde chceme čiernu farbu priradíme hodnotu pixelu číslom 1. Interne si môžme zadefinovať, že farba 0 bude zelená a farba 1 červená, čiže nie je to striktne obmedzené len na čiernobiely obraz, ale ľubovoľný dvojfareb obraz. To, akým spôsobom budeme danú farbu reprezentovať na výstupe je dané v samotnom formáte obrázku, ktorý určuje priamo konkrétny typ obrazového formátu (PCX, JPG, PNG, a podobne). Avšak vždy si môžme vytvoriť rôzne pseudo farebné modely, ktoré nám budú reprezentovať farbu. Najčastejšie sa používa indexový mód, kde farba nie je reprezentovaná priamo hodnotou pixelu, ale je ukazovateľom do tabuľky, v ktorej sa nachádza farebná paleta. Je možné si tak preddefinovať, vytvoriť napr. tucet farieb a priradiť im konkrétny index. Ďalšou možnosťou je reprezentovať obraz v odtieňoch šedej farby, tzv. static gray, kde každý bod v obraze je reprezentovaný odtieňom šedej farby. Obraz je tak „hladší“, obsahuje odtiene, avšak je to odtieň vždy len jednej definovanej farby. Posledný prípad je taký, kde je obraz reprezentovaný tromi farbami, najčastejšie RGB hodnotami, tzv. direct color mód. Existuje aj True color obraz, ktorý obsahuje priamo farebné hodnoty v jednotlivých pixeloch.

My budeme používať direct color mód, teda, budeme reprezentovať jednotlivé zložky RGB pre každý pixel zvlásť.

Ako je možné vidieť, každú farbu zapíšeme v troch zložkách. Plátno Canvas bude obsahovať pixely s troma zložkami farieb. Nasledujúci kód ukazuje už prístup k plátnu.

O farbách bude samostatná kapitola, preto na tomto mieste ešte spomenieme, ako extrahovať jednotlivé zložky z celočíselného formátu. Teda, nemusíme písať hodnotu každého pixelu v troch zložkách zvlášť, tak ako sme to uviedli vyššie. Je možné, napokon ako bolo tiež uvedené, zapísať farbu ako jedno celé číslo, ktoré bude obsahovať hodnotu všetkých troch zložiek farby. Existuje na to takýto vzorec:

\(RGB farba = R + (G * 256) + (B* 256 * 256)\)

Ak zadáme napr.

\(RGB = (100, 150, 200)\)

dostaneme

\(13145700 = 100 + (150 * 256) + (200* 256 * 256)\)

Teda pixel na daných súradniciach bude obsahovať len jedno celé číslo. Problém je ten, že na prečítanie konkrétnej farby musíme toto číslo opäť konvertovať do troch zložiek RGB, inak sa nedozvieme o akú farbu konkrétne ide. Takže takýmto spôsobom potrebujeme minimálne dve funkcie, ktoré budú riešiť tieto prevody. Podrobnejšie to bude preberané v článku o farbách.

Kompresia rastrového obrazu

Ako už bolo uvedené, rastrová reprezentácia obrazu je nešetrná na pamäť. Z toho dôvodu je niekedy vhodné použiť nejaké kompresné algoritmy pre obrazy a jednotlivé formáty (napr. JPEG, TIFF, PNG). Avšak v našom prípade to nebude potrebné jednak preto, že výsledný obrázok na dnešné technické pomery počítačov nebudú veľké a jednak preto, že algoritmy pre kompresie obrazu je pomere ťažšie naprogramovať. Takže budeme používať nekomprimovaný formát PPM (Portable Pixel Map), ku ktorému existuje voľne šíriteľný zdrojový kód na internete, pričom podrobnejšie bol tento formát popísaný v úvodnom článku tohto seriálu. Teoreticky vzaté by bolo možné výstupné dáta tohto formátu konvertovať a komprimovať nejakým kompresným algoritmom a dostať tak komprimovaný obrázok. Ale určite by to bolo časovo náročnejšie. Takže pre naše účely bude postačovať tento formát.

You may also like...