Matlab zľahka - Farby
MATLAB je mocný nástroj, zvládnete s ním veľa: detekovať tvár vo videu, vytvoriť ladičku gitary, vyhodnotiť exportované dáta z chytrých hodiniek, modelovať uhoľnú elektráreň, pripojiť ho k Arduino a tiež prebdieť celú noc pri hľadaní nejakej hlúpej chyby Zvládne toho pochopiteľne oveľa viac.
Už názov (matrix laboratóriá) zachytáva, že má čo dočinenia s maticami. Matica je usporiadanie čísel do mriežky. V takejto mriežke môžu byť zachytené napríklad farebné odtiene. Digitálny obraz sú práve takéto matice a MATLAB si s nimi vie veru dobre poradiť, čo si teraz ukážeme.
Načítanie a zobrazenie obrázka
Obrázok musíte mať v aktuálnej zložke alebo do úvodzoviek zadať absolútnu cestu.
A = imread('kytka256.jpg');
imshow(A)
Odporúčam písať kód do skriptu (Home -> New Script
),
celé to po načítaní a spustenie kódu (najlepšie pomocou Ctrl +
Enter) môže vyzerať takto:
Vľavo dole je Workspace, čo sú premenné aktuálne načítané v
operačnej pamäti, s ktorými môžeme pracovať. Teraz je tam len premenná
A
a dozvieme sa o nej informáciu, že je veľkosti 256 x 256 x 3
typu uint8
. 256 pixelov má v oboch rozmeroch obrázok kvety.
Trojka znamená, že takto veľké matice sú tam v skutočnosti tri. Každá
nesie informáciu o jednej základnej farbe - červenej, zelenej a modrej.
Anglicky v skratke RGB.
Rozklad farebných kanálov
Jednotlivé farebné kanály (teda tie tri matice) dávajú dohromady výsledný obraz. Teraz si obraz rozložíme, aby sme mohli zobraziť jednotlivé farebné zložky:
R = A(:,:,1); G = A(:,:,2); B = A(:,:,3); imshow(R)
Popísané slovami robí kód na prvom riadku toto: Z premenné A vezmi
všetky riadky (prvá dvojbodka), všetky stĺpce (druhá dvojbodka), prvý
maticu a priraď to do premennej R. R
, G
a
B
teraz obsahujú každá inú farebnú časť. Môžete si
všimnúť, že sa do Workspace pridali práve tieto premenné a ich veľkosť
je 256 x 256. Posledný riadok kódu je len zobrazenie červeného kanálu.
Aj napriek tomu, že obrázok reprezentuje červenú zložku, tak je
čiernobiely (respektíve šedotónový). To je práve z dôvodu, že je to
jedna prostá matice, ktorú funkcia imshow()
vníma ako rôzne
odtiene medzi bielou a čiernou farbou. Farby dokáže zobraziť iba v prípade,
že premenná je trojrozmerná. K lepšiemu pochopeniu si zobrazíme pôvodnej
obraz spolu so všetkými kanálmi:
subplot(2,2,1); imshow(A); title('RGB') subplot(2,2,2); imshow(R); title('Cervena') subplot(2,2,3); imshow(G); title('Zelena') subplot(2,2,4); imshow(B); title('Modra')
Funkcia subplot()
umožňuje do jedného okna vykresliť
viacerých objektov. Prvými dvoma parametrami sa rozdelí okno na mriežku o
patričnej veľkosti (v tomto prípade 2 riadky a 2 stĺpce), tretím parametrom
určíme, do akej bunky tejto mriežky budeme následne vykresľovať a písať
titulok.
Na tomto obrázku môžeme pozorovať, ako prebieha skladanie farieb. Čím bližšie je odtieň v smere bielej, tým viac je na danom mieste zastúpený. Všimnite si, že žltá kvet je výrazná v červenom a zelenom kanála. Žltá je v skutočnosti zloženina práve týchto dvoch farieb. Modro-zelené listnaté pozadie má v červenom kanáli zas tmavý odtieň.
RGB kocky
Náhodou je základných farieb rovnako, ako rozmerov v priestore, v ktorom žijeme, a tak môžeme miešanie farieb názorne demonštrovať na RGB kocku.
Tri základné farby obsadia 3 vrcholmi okolo čiernej farby. Hrany, ktoré
vedú k farbám, si môžeme predstaviť ako škále od 0
do
255
. RGB zápis napríklad pre žltú farbu
[255 255 0]
je stretnutie priesečníkov na hodnotách
jednotlivých stupníc práve vo vrchole, ktorý náleží žltej farbe.
Ostávajú ešte 2 farby, teda purpurová, Ona je kombináciou červenej a
modrej, s nulovou prítomnosťou zelené, [255 0 255]
, a azúrová,
anglicky tiež cyan čiže modro-zelená, [0 255 255]
. Biela
znamená, že všetky farby sú naplno, teda [255 255 255]
. Takto
farebne fungujú LCD displeja, kde každý pixel je vlastne kombináciou 3
farebných LEDiek, intenzita ich svietenia určuje výslednú farbu. Ľudské
oko pracuje na podobnom princípe. Rôzne vlnové dĺžky svetla vníma pomocou
troch druhov čapíkov, intenzitu ich dráždenie potom mozog interpretuje ako
farby. Výmenou jednotlivých farebných kanálov v našom obrázku môžeme
poskladať celé spektrum farebných kvetín.
Skladanie matíc vykonáme napríklad funkcií cat()
(skrátka
pre CONCATENATE, nie mačku ).
Prvým parametrom je rozmer, v ktorom budeme objekty lepiť. V druhom a ďalšom
parametra sa nachádza práve matice k zloženiu. V našom prípade farebné
kanály, avšak v inom poradí, tak aby sme dosiahli požadovaných farieb.
black = cat(3,B,B,B); white = cat(3,R,R,R); red = cat(3,R,B,B); green = cat(3,B,G,B); blue = cat(3,B,B,R); cyan = cat(3,B,G,R); magenta = cat(3,R,B,R); yellow = A; osmKytek = [black, red, green, blue; white, cyan, magenta, yellow]; imshow(osmKytek)
Obrázok sme nečítali funkcií imread()
a analogicky k nej
existuje funkcie imwrite()
, ktorá objekt uloží do patričného
súboru:
imwrite(osmKytek,'osmKytek.jpg');
HSV - Farebný formát
HSV (Hue, Saturation, Value) je farebný formát umožňujúci s farbami zaobchádzať prirodzenejším spôsobom. Pre definíciu farby každého pixelu potrebujeme tiež 3 hodnoty. Hue určuje akého odtieni farba bude. Saturation ako moc je farba sýta a Value, ako je farba tmavá, či svetlá. Dobre to vysvetlí nasledujúci obrázok, teda color picker z grafického editora Gimp. Kolieskom sa vyberie odtieň a v trojuholníku doladíte farbu.
Segmentácia kvety
MATLAB obsahuje funkciu rgb2hsv()
, ktorá 3 matica s farebnými
kanálmi prevedie na 3 matice formátu HSV. Hodí sa to napríklad, keď
potrebujeme vybrať iba nejaký farebný odtieň. Vo formáte RGB by to
pochopiteľne možné bolo, však pre presnú segmentáciu by sme museli
prepájať informácie z viacerých farebných kanálov, takto segmentáciu
robíme len na jednom:
A_HSV = rgb2hsv(A);% převod na HSV hueMin = 0.000; hueMax = 0.280; hueMask = (A_HSV(:,:,1) > hueMin ) & (A_HSV(:,:,1) < hueMax); % tvorba binární matice A_HSV(:,:,2) = A_HSV(:,:,2) .* hueMask; % nastaveni sytosti na 0 mimo kytku imgResult = hsv2rgb(A_HSV);%převod zpět na RGB imshow(imgResult);
Segmentácia bola vykonaná na kanále odtieňa (tom prvom) tvorbou binárne
masky. V premenné hueMask
sú jednotky na mieste, ktoré
spĺňajú obe podmienky, teda hodnota pixelu je medzi hueMin
a
hueMax
. K odobratie farieb dochádza na miestach, kde sa
nenachádza žltý kvet (teda mimo rozsah zvoleného farebného odtieňa). Toto
odobratie bolo vykonané na kanáli saturácie (kanál 2). Ak nastavíme totiž
saturáciu na nulu, bude výsledok šedotónový, nezávisle od odtieňa. Tento
fakt si môžete overiť napríklad v color Picker v Gimpu (pri nulovej
saturáciu a otáčania kolieska sa farba nemení).
Farebné odtiene v animácii
Zmena farebného odtieňa obrazu prevedeného do HSV formátu je len zmenou tej prvej matice. Presne to, čo robí nasledujúci kód:
Ahsv = rgb2hsv(A); for ii = [0:0.05:1,1:-0.05:0] % definice vektoru pro forcyklus Ahsv_new = Ahsv; %nakopírování proměnné Ahsv_new(:,:,1) =ii; %Nastavení stejného odstínu v celém obraze na určitou hodnotu A_new = hsv2rgb(Ahsv_new); % převod zpět na RGB imshow(A_new) % zobrazení pause(0.2) % pozastavení na 2 desetiny sekundy (tzn. animace s 10 FPS) end
To je pre tentokrát všetko. V priloženom súbore všetok kód pohromade.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 23x (1.2 kB)
Aplikácia je vrátane zdrojových kódov