Transformace je popsána funkcí , která váže souřadnice
v původním obrázku a souřadnice
v novém obrázku:
![]() |
(1) |
Obrazovou funkci původního obrázku již máme značenou . Označíme-li
obrazovou funkci nového obrázku
, pak platí:
![]() |
(2) | ||
![]() |
(3) |
Tyto vztahy můžeme přepsat do kompaktnějšího tvaru:
kde ,
a
jsou řádky matice
tvořené koeficienty ze vztahů (4) a (5):
![]() |
(7) |
V této části si ukážeme, jak vypočítat matici , která
reprezentuje projektivní transformaci mezi dvěma obrazy. V těchto dvou
obrazech mějme tzv. lícovací body, tj. body které si v obrazech vzájemně
korespondují (označeny červeným křížkem):
![]() |
![]() |
Lícovacích dvojic nech<< je . Pro každou dvojici lícovacích bodů
mají platit vztahy (6), kam za
dosadíme
a za
dosadíme
. Pak hledáme
matici
takovou, aby (6) byla splněna pro všechny lícovací
dvojice.
Nalezení je obzvláště jednoduché, nebo<< vztahy (6) jsou v
prvcích
lineární. Úpravou vztahů totiž dostaneme:
Utvoříme z prvků matice vektor
a zapíšeme lineární soustavu rovnic pro tento vektor:
Soustavu vyřešíme a tím dostaneme vektor , který pak jen
přeskládáme do matice
a tím jsme hotovi.
![]() |
(11) |
V praxi se používá korespondencí více než 4, aby se zmenšil vliv chyby
při určení korespondujících bodů. Kvůli chybám je však také nulový
prostor matice [] prázdný a vektor [
] se hledá ve
smyslu nejmenších čtverců, tj. určí se jako
![]() |
(12) |
Nalezení vektoru se v takovém případě udělá pomocí SVD
(Singular Value Decomposition). Lze použít následující MATLAB kód:
% vypocitej vektor a [u,d,v]=svd(C); a=v(:,end);
Při použití metody nejmenších čtverců se chyba "rovnoměrně rozdělí" do všech sloupců, někde představuje zanedbatelnou změnu, jinde změnu velmi výraznou. Tomu je možné zabránit normalizací. Body v každém souřadném systému zvlášť se transformují tak, aby jejich težiště bylo v počátku a průměrná vzdálenost od počátku byla rovna sqrt(2), pro výpočet normalizační transformace lze použít funkci Tu=normu(u). Homografii An vypočtenou na normalizovaných bodech je pak nutné převést zpět A = inv(Tx)*An*Tu.