V dnešnom článku si ukážeme základné operácie s obrázkami v prostredí MATLAB. Zameriame sa na načítanie obrázku, prevzatie jeho zložiek, pochopenie jeho reprezentácii maticou. V prvom rade musíme rozlišovať obrázky s ktorými pracujeme t.j. čiernobiele / farebné, nakoľko je na tom závislá aj reprezentácia v prostredí MATLAB. Uvažujme v tomto prípade o obrázku s rozmerom 512x512px.
Čiernobiele obrázky sú po načítaní reprezentované počtom pixelov v matici, pričom každý pixel nadobúda hodnotu 0 až 255. Hovoríme teda o 8-bitovom obrázku, pričom hodnota 0 reprezentuje čiernu farbu a 255 bielu, ostatné hodnoty šedé spektrum medzi nimi. Celková matica čiernobielého obrázku má tak rozmer 512x512.
V prípade farebných obrázkov rozlišujeme tri farby (RGB model), teda červenú, zelenú a modrú zložku. Farebný obrázok je tak v prostredí MATLAB načítaný do 3D matice, kedy každá z matíc reprezentuje pixel v danej farbe. Celková matica farebného obrázku má tak rozmer 512x512x3. Každý pixel obrázku je tak tvorený kombináciou pixelu pre všetky 3 farby.
Pre načítanie obrázku v prostredí MATLAB použijeme funkciu imread(), ktorej výstupom je matica v ktorej máme obrázok uložený na základe RGB / GRAYSCALE obrázku v príslušnej dimenzii. Na ukážku použijeme farebnú - RGB fotografiu tváre primáta - Mandrila pestrotvárého s rozmerom 512x512 px na ktorom vyniknú jednotlivé farby RGB spektra.

Operácie, ktoré si s pôvodným obrázkom ukážeme:
- Prevod obrázku do grayscale - odtieňov šedej
- vstavanou MATLAB funkciou
- vlastnou funkciou
- Zmenšenie / zväčenie obrázku mierkou
- Otočenie obrázku transponovaním
- Skosenie obrázku vlastnou funkciou s lineárnou charakteristikou
Prevod pôvodného obrázka do otieňov sivej - GRAYSCALE je veľmi jednoduchý s použitím vstavenej funkcie rgb2gray(). V prípade vlastnej funkcie je možné využiť rôznu škálu riešení. Ako som pri farebných obrázkoch opisoval vyššie, obrázok má reprezentovaný každý pixel samostatne v každej farbe a pri vykreslení je pixel kombináciou týchto farieb. Prevod do čiernobielej palety tak môžeme realizovať z dominantnej zložky pixelu - tj. určitej farby. Daná farba tak vo výslednom obrázku zvýrazní (reprezentované bielou) práve časti danej farby pôvodného obrázka.
Červená zložka pixelu prevedená do GRAYSCALE:

Zelená zložka pixelu prevedená do GRAYSCALE:

Modrá zložka pixelu prevedená do GRAYSCALE:

V prípade, že chceme použiť férovejšiu metódu a použiť strednú hodnotu pixelu môžeme sčítať hodnoty jednotlivých zložiek pre každý pixel a vydeliť ju číslom 3, čím získame 8-bitovú hodnotu s maximálnou hodnotou 255. Výsledný obrázok bude zodpovedať priemeru jednotlivých hodnôt pre daný pixel. Nakoľko je fotografia relatívne "tmavá" (neobsahuje veľa bielej farby, t.j. maximálna hodnota každej zložky) a má väčšinou dominantné farby RGB spektra, výsledok je dosť tmavý so strednou hodnotou. Na obrázku vyniknú predovšetkým hlavné tvary - t.j, nozdry, linky tváre, oči...

Zmenšenie / Zväčenie obrázkov je možné realizovať cez MATLAB funkciu imresize(), ktorá používa parameter pre mierku - 1 aktuálna, < 1 = zmenšenie, > 1 = zväčenie. Obrázok nižšie poukazuje na zmenšenie obrázku o 50%, pričom obrázok bol vykreslený v rozlíšení 512x512, na pixelovej grafike je vidieť mierne znaky degradácie.

Otočenie obrázku transponovaním je možné realizovať cez dve populárne a rýchle funkcie. Jednou z nich je MATLAB funkcia rot90, ktorá zrealizuje v jednom kroku otočenie matice, čo otočí obrázok o 90° proti smeru hodinových ručičiek (otočenie vľavo). Ako ekvivalent je možné použiť aj MATLAB vstavanú funkciu permute s pretvorením matice - transpozíciou, t.j. vymenením stĺpcov. V tomto prípade z pôvodného 1 2 3 prešlo na výmenu 2 1 3, aby bolo možné dosiahnuť rovnaký výsledok (otočenie vľavo) ako v prípade použitia MATLAB funkcie rot90.

Skosenie obrázka nájde využitie pri potrebe výrezu určitej časti obrázka. Skosením sa rozumie nahradeie istej oblasti obrázka určitou farbou, najčastejšie čiernou, alebo bielou. Nakoľko má MATLAB graf (figure) štandardne s bielým pozadím, je efektívne v tomto prípade použiť nahradenie určitej časti obrázka bielou farbou, nakoľko to z hľadiska používateľa a výstupu bude pôsobiť ako vyrezaná - chýbajúca časť obrázka.
Nakoľko máme obrázok s identickým pomerom strán, môžeme využiť lineárnosť, ktorú obrázok ponúka. Jednoduchým prechodom cez maticu v diagonálnom smere môžeme nahradiť všetko pod diagonálou bielou farbou, čím získame orezanie polovice obrázka. "Orezanie" (nahradenie existujúcej hodnoty pixelov bielou farbou) prechádza diagonálou celej 3D matice, t.j. z bodu 1x1x1 po 512x512x3. Prechod cez diagonálu je možné vyriešiť jednoduchým while / for cyklom, ktorý prechádza hodnotami po diagonále pre XxYx1 po XxYx3

Výsledné reprezentácie je možné vypísať do grafu - figure, ktorý prispôsobí veľkosť obrázkov rozlíšeniu obrazovky používateľského zariadenia, pričom sú obrázky dynamicky vložené do riadkov s použitím subplotov s reprezentáciou obrázkov - počet riadkov, počet stĺpcov, poradie.

Script u: martinius96@gmail.com