Aubrecht Emil, Kocián Jan                                                                                                           8.4.2000

 

PVI - úloha 1

Skládání obrázků

Úkoly

Pomocí MatLabu složte dva obrázky navazujících částí objektu focené z jednoho místa do jednoho společného.

Potřebná data

dva vyhovující obrázky, pozice korelujících bodů v obou obrázcích (minimálně 4)

Obecný postup

Řešení úlohy lze rozložit na následující tři části

1.   Příprava dat

V této části je třeba načíst oba obrázky (případně je přetransformovat) a pozici korelujících bodů v obou obrázcích (případně je zobrazit).

Dále je nutno připravit si dostatečně velký výsledný obrázek (matici), zkopírovat do něj jeden z obrázků na vhodnou pozici a též určit pozici korelačních bodů kopírovaného obrázku v obrázku výsledném (zkopírování není nutné, ale značně se tím zjednoduší další postup – není nutno vytvářet transformační matice do obou obrázků).

2.   Získání transformační matice

Tato část je v postupu nejpodstatnější, protože vytvořením pomocí transformační matice budeme schopni zobrazit libovolný bod ve výsledném obrázku do druhého (nezkopírovaného) obrázku a naopak.

Matice se samozřejmě tvoří ze zadaných bodů, tedy víme, že pro všechny dvojice korelujících bodů platí, kde ui, vi  jsou sloupcové vektory bodů (3x1 - hodnoty xi, yi, 1), je konstanta pro danou dvojici a H je transformační matice. Po několika úpravách získáme rovnici ve tvaru , kde A je matice 2Nx9, h vektor 9x1 z matice H (h11, h12, ...), ,
xpi, ypi, jsou x-ové a y-ové souřadnice bodu pi.

Pro řešení výsledné rovnice (soustavy) nám postačí zadání 4 bodů, pro 5 bodů je již soustava přeurčená. Pro čtyři body lze tedy vyřešit zadanou soustavu, pro větší počet bodů je nutno použít přibližnou metodu výpočtu, která nám nalezne matici co nejbližší“ matici k matici A s hodností 8 - například Singular Value Decomposition (SVD).

3.   Převzorkování obrázků

V této části se pomocí transformační matice převedou pixely z druhého obrázku do obrázku výsledného. Pro urychlení se však používá opačný postup – pro jednotlivé pixely výsledného obrázku se hledá jejich originál ve druhém obrázku a jeho barva se poté použije.

Transformací samozřejmě nedostaneme přesnou polohu originálního pixelu, takže je třeba zvolit přibližnou metodu pro získání barvy. Jednoduchá je metoda nejbližšího souseda kdy použijeme pixel nejblíže získané polohy – souřadnice jednoduše zaokrouhlíme. Mnohem přesnější je metoda bilineární interpolace, kdy barvu pixelu určíme jako vážený průměr barev všech čtyř okolních pixelů.

Naše implementace

Postup našeho výpočtu je uložen v souboru uloha1.m. Dále budou uvedeny pouze poznámky k tomuto postupu:

1.   Pro zrychlení výpočtu jsme obrázky převedli do odstínů šedi.

2.   Pro výpočet transformační matice byla použita funkce uu2homog, která používá přibližné řešení, je tedy možno zadat více bodů.

3.   Pro převzorkování byla použita metoda nejbližšího souseda, je možno volit mezi verzí s použitím for-cyklů nebo maticovou verzí, která je v MatLabu podstatně rychlejší, ale mnohem hůře pochopitelná.

Ukázka postupu

Závěr

Použitím skriptu v souboru uloha1.m lze úspěšně složit zadané dva obrázky.