Metoda nejmenších čtverců, geometrické transformace

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.

Proložení 2D bodů přímkou

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.

Projektivní transformace obrazu

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.

Jednoduché panorama

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.

Odevzdávaná úloha

  1. [2b] Vytvořte funkci [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).
  2. [1b] V komentáři funkce vysvětlete rozdílné chování při přidání outlieru [10;2] nebo [0;0] k uvedené šestici bodů X.
  3. [3b] Vytvořte funkci 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.
  4. [0b] Označte korespondující páry x,u (2×n) na dvojici sousedních fotografií I1,I2, uložte je jako corr.mat.
    Pro první a druhý obraz můžete použít připravenou čtveřici korespondujících párů corr.mat.
  5. [3b] Vytvořte funkci Iout = panorama2(I1,I2,x,u), která spojí fotografie I1,I2 do panoramatu na základě korespondencí x,u.
    Pokud se vám to nepovede, alespoň transformujte jednu fotografii do projekce druhé.
    Nouzově můžete místo imtransform použít warpimage.m.
  6. [1b] Vyzkoušejte konfiguraci korespondencí a) blízko sebe a b) na přímce. V komentáři funkce 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.