Matlab zlehka - Barvy
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 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:

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.

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.

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.

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.

Segmentace květiny

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

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žením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 23x (1.2 kB)
Aplikace je včetně zdrojových kódů