C a C++ týden ITnetwork Flashka zdarma
Akce! Pouze tento týden sleva až 80 % na kurzy C++. Lze kombinovat s akcí 50 % bodů navíc na prémiový obsah!
Brno? Vypsali jsme pro vás nové termíny školení Základů programování a OOP v Brně!

Matlab zlehka - Barvy

Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem.
Vydávání, hosting a aktualizace umožňují jeho sponzoři.

MATLAB je mocný nástroj, zvládnete s ním mnoho: detekovat obličej ve videu, vytvořit ladičku kytary, vyhodnotit exportovaná data z chytrých hodinek, modelovat uhelnou elektrárnu, připojit ho k Arduinu a také probdít celou noc při hledání nějaké hloupé chyby :) Zvládne toho pochopitelně mnohem víc.

Už název (MATrix LABoratory) zachycuje, že má co dočinění s maticemi. Matice je uspořádání čísel do mřížky. V takovéto mřížce můžou být zachyceny například barevné odstíny. Digitální obraz jsou právě takovéto matice a MATLAB si s nimi umí věru dobře poradit, což si teď ukážeme.

Načtení a zobrazení obrázku

Obrázek květiny

Obrázek musíte mít v aktuální složce nebo do uvozovek zadat absolutní cestu.

A = imread('kytka256.jpg');
imshow(A)

Doporučuji psát kód do skriptu (Home -> New Script), celé to po načtení a spuštění kódu (nejlépe pomocí Ctrl + Enter) může vypadat takto:

Vykreslení obrázku v MATLAB

Vlevo dole je Workspace, což jsou proměnné aktuálně načtené v operační paměti, se kterými můžeme pracovat. Nyní je tam pouze proměnná A a dozvíme se o ní informaci, že je velikosti 256 x 256 x 3 typu uint8. 256 pixelů má v obou rozměrech obrázek květiny. Trojka znamená, že takto veliké matice jsou tam ve skutečnosti tři. Každá nese informaci o jedné základní barvě – červené, zelené a modré. Anglicky ve zkratce RGB.

Rozklad barevných kanálů

Jednotlivé barevné kanály (tedy ty tři matice) dávají dohromady výsledný obraz. Nyní si obraz rozložíme, abychom mohli zobrazit jednotlivé barevné složky:

R = A(:,:,1);
G = A(:,:,2);
B = A(:,:,3);

imshow(R)

Popsáno slovy dělá kód na prvním řádku toto: Z proměnné A vezmi všechny řádky (první dvojtečka), všechny sloupce (druhá dvojtečka), první matici a přiřaď to do proměnné R. R, G a B nyní obsahují každá jinou barevnou část. Můžete si všimnout, že se do Workspace přidaly právě tyto proměnné a jejich velikost je 256 x 256. Poslední řádek kódu je pouze zobrazení červeného kanálu.

Červený kanál obrázku květiny v MATLAB

I přesto, že obrázek reprezentuje červenou složku, tak je černobílý (respektive šedotónový). To je právě z důvodu, že je to jedna prostá matice, kterou funkce imshow() vnímá jako různé odstíny mezi bílou a černou barvou. Barvy dokáže zobrazit pouze v případě, že proměnná je trojrozměrná. K lepšímu pochopení si zobrazíme původní obraz spolu se všemi kanály:

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')

Funkce subplot() umožňuje do jednoho okna vykreslit více objektů. Prvními dvěma parametry se rozdělí okno na mřížku o patřičné velikosti (v tomto případě 2 řádky a 2 sloupce), třetím parametrem určíme, do jaké buňky této mřížky budeme následně vykreslovat a psát titulek.

Jednotlivé barevné kanály obrázku květiny v MATLAB

Na tomto obrázku můžeme pozorovat, jak probíhá skládání barev. Čím blíže je odstín ve směru bílé, tím více je na daném místě zastoupen. Povšimněte si, že žlutá květina je výrazná v červeném a zeleném kanálu. Žlutá je ve skutečnosti složenina právě těchto dvou barev. Modro-zelené listnaté pozadí má v červeném kanálu zas tmavý odstín.

RGB krychle

Náhodou je základních barev stejně, jako rozměrů v prostoru, ve kterém žijeme, a tak můžeme míchání barev názorně demonstrovat na RGB krychli.

RGB krychle v MATLAB

Tři základní barvy obsadí 3 vrcholy kolem černé barvy. Hrany, které vedou k barvám, si můžeme představit jako stupnici od 0 do 255. RGB zápis například pro žlutou barvu [255 255 0] je setkání průsečíků na hodnotách jednotlivých stupnic právě ve vrcholu, který náleží žluté barvě. Zbývají ještě 2 barvy, tedy purpurová, kterážto je kombinací červené a modré, s nulovou přítomností zelené, [255 0 255], a azurová, anglicky též cyan neboli modro-zelená, [0 255 255]. Bílá znamená, že všechny barvy jsou naplno, tedy [255 255 255]. Takto barevně fungují LCD displeje, kde každý pixel je vlastně kombinací 3 barevných LEDek, intenzita jejich svícení určuje výslednou barvu. Lidské oko pracuje na podobném principu. Různé vlnové délky světla vnímá pomocí třech druhů čípků, intenzitu jejich dráždění pak mozek interpretuje jako barvy. Výměnou jednotlivých barevných kanálů v našem obrázku můžeme poskládat celé spektrum barevných květin.

Skládání matic provedeme například funkcí cat() (zkrátka pro concatenate, nikoliv kočku :) ). Prvním parametrem je rozměr, ve kterém budeme objekty lepit. V druhém a dalším parametru se nachází právě matice ke složení. V našem případě barevné kanály, nicméně v jiném pořadí, tak abychom dosáhli požadovaných barev.

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ázek jsme nečetli funkcí imread() a analogicky k ní existuje funkce imwrite(), která objekt uloží do patřičného souboru:

imwrite(osmKytek,'osmKytek.jpg');

HSV - Barevný formát

HSV (Hue, Saturation, Value) je barevný formát umožňující s barvami zacházet přirozenějším způsobem. Pro definici barvy každého pixelu potřebujeme též 3 hodnoty. Hue určuje jakého odstínu barva bude. Saturation jak moc je barva sytá a Value, jak je barva tmavá, či světlá. Dobře to vysvětlí následující obrázek, tedy color picker z grafického editoru Gimp. Kolečkem se vybere odstín a v trojúhelníku doladíte barvu.

Výběr barev v programu GIMP

Segmentace květiny

Segmentace obrázku v MATLAB

MATLAB obsahuje funkci rgb2hsv(), která 3 matice s barevnými kanály převede na 3 matice formátu HSV. Hodí se to například, když potřebujeme vybrat pouze nějaký barevný odstín. Ve formátu RGB by to pochopitelně možné bylo, nicméně pro přesnou segmentaci bychom museli propojovat informace z více barevných kanálů, takto segmentaci děláme pouze 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);

Segmentace byla provedena na kanále odstínu (tom prvním) tvorbou binární masky. V proměnné hueMask jsou jedničky na místě, které splňují obě podmínky, tedy hodnota pixelu je mezi hueMin a hueMax. K odebrání barev dochází na místech, kde se nenachází žlutá květina (tedy mimo rozsah zvoleného barevného odstínu). Toto odebrání bylo provedeno na kanálu saturace (kanál 2). Nastavíme-li totiž saturaci na nulu, bude výsledek šedotónový, nezávisle na odstínu. Tento fakt si můžete ověřit například v color pickeru v Gimpu (při nulové saturaci a otáčení kolečka se barva nemění).

Barevné odstíny v animaci

Barevné odstíny v animaci v MATLAB

Změna barevného odstínu obrazu převedeného do HSV formátu je pouze změnou té první matice. Přesně to, co dělá následující 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 pro tentokrát vše. V přiloženém souboru veškerý kód pohromadě.


 

Stáhnout

Staženo 11x (1.2 kB)
Aplikace je včetně zdrojových kódů

 

 

Článek pro vás napsal tesař.tech
Avatar
Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!
Autor se věnuje dýchání přibližně celý život
Předchozí článek
Práce s maticemi a vektory
Všechny články v sekci
Matlab
Miniatura
Následující článek
Matlab zlehka - Vektory a matice dějství první
Aktivity (4)

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!