Nejprve se podívejte na MATLAB demo, které je k dispozici příkazem
imadjdemo
.
Jednou z nejjednodušších operací s obrazy je transformace jasů. Nejde o nic jiného, než že v každém pixelu se stávající hodnota jasu nahradí jinou podle předepsané transformační tabulky. Algoritmus lze popsat takto:
for i=1 to sirka_obrazku for j=1 to vyska_obrazku pro pixel (i,j): vezmi jeho jas I a nahrad ho f(I) end end
Transformaci si hned vyzkoušíme. Řekněme, že transformací se má získat negativ obrázku. V takovém případě bude mít transformační tabulka tento tvar:
stávající hodnota | 0 | 1 | 2 | 3 | ... | 254 | 255 | |
nová hodnota | 255 | 254 | 253 | 252 | ... | 1 | 0 |
f=255:-1:0;
Nyní už můžeme pseudokód implementovat v MATLABu - negativ se vytvoří
do proměnné NEG
:
NEG=zeros(size(IM)); % inicializace proměnné NEG tic for i=1:size(IM,2) for j=1:size(IM,1) NEG(j,i)=f(IM(j,i)+1); end end toc
Všiměme si nejprve klíčového příkazu NEG(j,i)=f(IM(j,i)+1)
.
Co to znamená?
Prvky vektoru f
se indexují hodnotou IM(j,i)+1
,
což je hodnota
jasu pixelu (j,i) zvětšeném o jedničku. Zpětným pohledem na tabulku
se přesvědčte, že je to přesně to, co chceme: jas 0 chceme vyměnit
za jas 255, který je na prvním místě, takže se indexuje jedničkou, atd.
Jde o známý trik tzv. look-up tabulky.
Dále si všimneme dvojice tic
a toc
. Jde o spuštění
a zastavení stopek a takovou dvojici můžete použít, kdykoli se chcete
dozvědět, jak dlouho provedení nějaké části kódu trvá.
MATLAB je ale maticově orientované prostředí a daný algoritmus v něm můžeme implementovat kompaktněji a také mnohem rychleji. Vyzkoušejte si následující kód:
NEG=f(IM+1);
Tento zápis se nám jistě líbí pro svou krátkost. Přesvědčte se pomocí stopek
o tom, že je také mnohokrát rychlejší než předchozí verze. Tento příklad
si dobře zapamatujte: tím, že v MATLABU použijete maticový zápis
místo cyklů si můžete v případě složitějších algoritmů podstatně zkrátit
čekání na výsledek.
Jak výše napsaný příkaz funguje? Matice f
se indexuje jinou maticí, v tomto případě výsledkem aritmetické
operace IM+1
.
T
,
nahradí 0, a ty, které jsou vyšší nebo rovny T
se nahradí
255. Udělejte si transformační tabulku pro tento typ transformace
a vyzkoušejte si ji pro T=20, T=128, T=250.
(a,b,c,d)
,
výstupním vektor f
. Vyzkoušejte si funkčnost
pro několik hodnot a,b,c,d
.
Na přednášce jste probírali ekvalizaci histogramu jasů. Připomeňme,
jaký je výsledek ekvalizace: jasy se ztransformují tak, aby každý z nich
"měl pro sebe" takovou část jasové osy, jaké je jeho zastoupení
v obrázku. Předpokládejme, že histogram původního obrázku je následující
(pro jednoduchost zde kreslíme případ, kdy v obrázku jsou zastoupeny jen 4 jasy I1..I4):
Jasy po ekvalizaci budou následující (f(I1), f(I2) .. f(I4)):
Obrázek ukazuje grafickou konstrukci transformační tabulky. Všiměte si, že jednotlivé sloupce stojí na základnách stejně dlouhých, jako jsou samy. To je podstatou tvrzení, že jednotlivé jasy mají mít kolem sebe místa úměrně jejich zastoupení. Transformaci lze tedy realizovat následovně: sloupce naklademe vedle sebe, na začátek dáme nulu, na konec 255, a jednotlivé jasy umístíme do půlek nakladených sloupců.
Implementujte funkci histogramu jasů (tj. udělejte vlastní
implementaci na základě výkladu, nepoužívejte funkci histeq
).
Správné fungování si ověříte například tak, že se podíváte
na kumulativní histogram jasů ve výsledném obraze. Měl by být,
jak víte, lineární.