Cvičení 2 - Diskrétní obraz
A) Teoretický úvod
Šedotónový obraz je jako dvojrozměrná diskrétní veličina v počítači reprezentován maticí řádu 2. Řádky a sloupce matice určují samotnou obrazovou rovinu, prvky matice pak jasové hodnoty v příslušném obrazovém bodě (pixel). Pokud jde o šedotónový obraz (někdy nesprávně označován jako černobílý), jsou jednotlivé prvky matice tvořeny skalárem udávající hodnotu intenzity jasové funkce. Takový šedotónový obraz je zpravidla uložen v paměti počítače v osmibitové barevné hloubce tj. se 256 stupni šedi. Na každý obrazový bod je tedy zapotřebí 1 Byte paměti. Reprezentaci matice dat při zpracování diskrétního šedotónového obrazu o rozměru 8×8 pixelů ukazuje následující obrázek.
V případě barevného obrazu je dvojrozměrná matice definována zvlášť pro každou základní barevnou složku (červená, zelená a modrá). Tyto matice určují intenzity jednotlivých spektrálních složek v příslušných místech obrazu a teprve jejich aditivním složením vznikne dojem barevného obrazu. Graficky lze tento proces vyjádřit jako překrytí tří obrazů za použití metriky prostého součtu prvků. Vznik barevného obrazu ze tří matic základních spektrálních složek ukazuje následující obrázek.
Třetí a poslední běžný typ obrazu z hlediska barevné hloubky je binární obraz. Prvky matice jsou pouze 0 resp. 1 a reprezentují černou resp. bílou barvu. Bitová hloubka u těchto obrazů je tedy vždy rovna jedné. Binární obrazy se zpravidla používají pro definici obrazových masek. Prostým násobením prvků obrazu a masky téže velikosti lze filtrovat odpovídající části obrazu. Kromě výše uvedených typů obrazů existují ještě speciální tzv. multispektrální obrazy, které nejsou předmětem kurzu.
B) Úkoly
- Vytvořte matici představující obrazovou rovinu šedotónového obrazu o rozměrech 640×480 bodů s nulovými prvky.
- Pokuste se vepisováním obdélníků různých odstínů šedi co nejvěrněji napodobit první obrázek zobrazený v sekci D) Ilustrace výsledků. Vyzkoušejte si zápis hodnot nejprve obecným způsobem pro práci s libovolným dvojrozměrným polem hodnot (bod po bodu – for cyklus), poté optimalizujte použitím vektorových a maticových operací Matlabu do jednoho řádku kódu (1 obdélník = 1 řádek).
- Z vytvořeného obrazu vytvořte binární obraz. Všimněte si jaký datový typ Matlab používá.
- Obdobně jako v předchozím případě vygenerujte barevný obraz složením tří šedotónových obrazů představující složky červené, zelené a modré barvy. Obrazy navrhněte tak, aby ve výsledném barevném obrazu vznikly všechny kombinace tří základních barev. Pro srovnání vykreslete současně všechny tři složkové obrazy a obraz barevný do jednoho okna. Vykreslované složkové obrazy získejte z výsledného barevného obrazu.
- Načtěte obraz rubikovaC.bmp z disku. Do nové proměnné uložte část obrazu zhruba jak ukazuje levý prostřední obrázek v sekci D) a detail zobrazte. Jeden řádek z detailu (např. černá linka) zobrazte jako tři jednorozměrné signály (červená složka červeně apod.).
- U původního barevného obrazu rubikovy kostky proveďte tyto operace:
- vepište čtverec oranžové barvy,
- určete přesný odstín oranžové části kostky (přední stěna uprostřed) a tuto barvu zapište do dalšího čtverce,
- ve vybrané oblasti vynulujte nejdříve pouze jednu barevnou složku,
- v jiné části vynulujte současně všechny barevné složky,
- prohoďte barevné složky, např. R → G, G → B, B → R,
- výsledný obraz zobrazte a uložte na disk jako png soubor.
Bonus: V bodě 4) se vhodnou kombinací prolínání jednotlivých barevných složek pokuste realizovat duhu.
C) Dobré vědět
- Datové typy pro obrazy: pro vykreslení obrazu je vhodný datový typ uint8 (rozsah 0..255). Pozor! Pro práci s prvky matice je zpravidla nutné hodnoty přetypovat na vyšší datový typ (int16, uint16, double, …) kvůli případnému přetečení při aritmetických operacích. Naopak neustálé používání rozsahově vyššího datového typu např. double není vhodné z hlediska rychlosti zpracování a z hlediska správného vykreslení jasových úrovní.
- Povolené funkce: imread, imwrite, imshow, subplot, image, imagesc, figure, colormap, title
- Nepovolené funkce: Nejsou.