V tomto cvičení si ukážeme řešení soustavy lineárních rovnic metodou nejmenších čtverců (Least Squares Estimation) použitou na odhad geometrické transformace obrazu.
Nejdříve se pokuste vyřešit jednodušší úlohu, která dobře ilustruje princip
a některé vlastnosti metody nejmenších čtverců:
máme změřené souřadnice bodů X
ležících na přímce, ale
měření je zatíženo chybou. Nalezněte parametry přímky p: ax+by+c=0
tak, aby součet čtverců algebraických chyb na soustavě rovnic p byl minimální.
X=[1,2,4,6,7,9; 3.3713,2.5503,1.6883,-0.0009,0.0143,-0.9129]
Pro každý bod sestavte jednu rovnici, získáte soustavu 6 rovnic
o 3 neznámých. Vyřešte ji pomocí Singular Value Decomposition svd
,
podle odvození řešení prolému nejmenších čtverců.
Nyní jako sedmý bod přidejte přidejte zcela chybné měření (outlier),
nejprve X(:,7)=[10;2]
a odhadněte znova přímku.
Pak vyměňte sedmý bod X(:,7)=[0;0]
a opět odhadněte přímku.
Oba přidané body byly přibližně stejně vzdálené od původně odhadované
přímky. Proč první výrazně ovlivní nový odhad a druhý jej téměř nezmění?
Uvědomte si rozdíl mezi algebraickou a geometrickou chybou.
Výše ilustrované nežádoucí chování metody nejmenších čtverců lze potlačit normalizací. Tato normalizace je navržená pro použití s odhadem homografie (následující část této úlohy), ale její fungování názorně uvidíte už při odhadu přímky. Kód funkce pointnorm.m máte k dispozici.
Nás bude zajímat, jak spočítat transformaci z korespondujících, též lícovacích, bodů. Toto je např. využíváno v nástrojích na vytváření panoramat z více fotografií, např. Hugin. Stáhněte si tři fotografie zámku Hořín pořízené z jednoho místa:
Vyberte si dvojici sousedních obrazů a označte alespoň čtyři korespondující
páry bodů (použijte funkci ginput
). Z těchto korespondencí vypočtěte
projektivní transformaci A
mezi oběma obrazy,
postup vysvětluje přednáška o výpočtu trasnformace z lícovacích bodů.
Aplikujte projektivní transformaci A
na příslušný obraz
pomocí funkce imtransform
. Vyzkoušejte následující rozložení
korespondencí: rovnoměrné po celém překrytu, blízko sebe, ležící v přímce.
Nyní máte dva obrazy pod stejnou
projektivní transformací, pokuste se je spojit do jednoduchého panoramatu.
Obrazy je potřeba přes sebe přeložit tak, aby jejich souřadnice souhlasily.
Ve vstupních obrazech se obrazové souřadnice shodují s indexy pixelů
v matici. Jakmile ale obraz transformujete do souřadného systému jiného
obrazu, nebude už souřadnice levého horního pixelu [1;1]
.
Pro spojení dvou obrazů do panoramatu si musíte spočítat posunutí mezi
obrazovými souřadnicemi a indexy pixelů. Částečně vám může ulehčit práci
funkce findbounds
, kterou zjistíte, jak transformace změní
rozsah souřadnic.
[p,err] = fitline(X)
, která metodou
nejmenších čtverců proloží přímku p: ax+by+c=0, p = [a,b,c]
body X
(matice 2×n). Algebraickou chybu na
jednotlivých bodech vraťte v err
(vektor 1×n).
[10;2]
nebo [0;0]
k uvedené šestici bodů X
.
A = calcA(x,u)
, která pro n>3
korespondující body x
a u
(matice 2×n) odhadne projektivní transformaci A
mezi nimi. Použijte normalizaci souřadnic.
x,u
(2×n) na dvojici
sousedních fotografií I1,I2
, uložte je jako corr.mat
.Iout = panorama2(I1,I2,x,u)
, která spojí
fotografie I1,I2
do panoramatu na základě korespondencí x,u
.imtransform
použít warpimage.m.
calcA
vysvětlete výsledky.
Do odevzdávaného archivu přidejte k vašim funkcím také ukázkový skript, který je postupně všechny zavolá a předvede.