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.
![](https://i.imgur.com/Egyvkse.png)
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:
![](https://i.imgur.com/KAvzO8V.png)
Zelená zložka pixelu prevedená do GRAYSCALE:
![](https://i.imgur.com/Z6STEP0.png)
Modrá zložka pixelu prevedená do GRAYSCALE:
![](https://i.imgur.com/M3IcCcU.png)
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...
![](https://i.imgur.com/GBllsns.png)
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.
![](https://i.imgur.com/tDvKnYY.png)
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.
![](https://i.imgur.com/pwzqvqn.png)
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
![](https://i.imgur.com/XAjqLAs.png)
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.
![](https://i.imgur.com/vtnXRT2.png)
MATLAB script tejto konkrétnej implementácie je dostupný na Githube:
https://github.com/martinius96/MATLAB-scripty/blob/main/Praca_s_obrazkami/RGB_GRAY_ukos.m