IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

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 kvety - Matlab

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:

Vykreslenie obrázka v MATLAB - Matlab

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.

Červený kanál obrázku kvetiny v MATLAB - Matlab

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.

Jednotlivé farebné kanály obrázku kvetiny v MATLAB - Matlab

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.

RGB kocky v MATLAB - Matlab

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.

Matlab

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.

Výber farieb v programe GIMP - Matlab

Segmentácia kvety

Segmentácia obrázku v MATLAB - Matlab

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

Farebné odtiene v animácii v MATLAB - Matlab

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

 

Predchádzajúci článok
Zobrazenie grafov v MATLAB
Všetky články v sekcii
Matlab
Článok pre vás napísal tesař.tech
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje dýchání přibližně celý život
Aktivity