Jasové transformace

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 0123...254255
nová hodnota 255254253252...10
Vektor reprezentující nové předepsané hodnoty si vytvoříme velmi snadno:

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.

Další jasové transformace

Vyzkoušejte si další jasové transformace. Jako základní příklady se nabízejí tyto:

Prahování

Při prahování se jasy, které jsou nižší než daný práh 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.

Po částech lineární funkce

Udělejte si funkci, která vám vytvoří transformační tabulku pro jasy podle následujícího grafu:

Vstupní parametry funkce jsou (a,b,c,d), výstupním vektor f. Vyzkoušejte si funkčnost pro několik hodnot a,b,c,d.

Ekvalizace histogramu jasů

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í.