Spojování obrazů

Laboratorní práce z předmětu Počítačové vidění pro informatiku, 33PVI

Milan Krčmář, letní semestr 1999/2000

Zadání

Spojte dva navazující obrazy focené z jednoho místa pouze otočením kamery do jednoho pomocí zadaných korespondujících bodů.

Postup

Model kamery

Odvození spojení obrazů vychází z matematického modelu kamery. Ve světovém souřadném systému (ortonormální báze) je umístěn pozorovaný bod o souřadnicích[1] a kamera, jejíž střed promítání je v bodě . Tento bod se do obrazu kamery promítá do souřadnic . Bodová matice obrazu má pouze dvě souřadnice, a , třetí se udává pro usnadnění dalšího zápisu. Na jeden bod se zobrazí celá přímka bodů . Rovnice této přímky je

Parametrem přímky je , je ortonormální rotační matice, která otáčí rozdílný vektor tak, aby světový souřadný systém byl kolmý na promítací rovinu kamery, matice vystihuje transformaci kamery, říká se jí kalibrační matice. Z této rovnice lze osamostatnit , dostáváme konečný tvar

,

ve kterém je rozšířen o čtvrtou jednotkovou souřadnici. Matice je jednotková 3,3.

Dvě kamery v jednom bodě

Zadání předpokládá, že jsou obrazy „focené z jednoho místa“. Znamená to, že kamera měla vždy stejnou polohu středu promítání, pouze se otočila. S výhodou volíme světový souřadný systém tak, aby měl počátek právě ve středu promítání, vektor bude potom nulový. Snímky označíme čísly 1 a 2. Pro jediný bod viditelný na obou snímcích musí platit zároveň rovnice obou kamer:

 a

U příslušných hodnot jsou indexy , protože budeme pracovat s více body a tyto rovnice musí platit pro každý (obecně -tý) bod. Pokud z levé rovnice vypočítáme a dosadíme do pravé (zároveň vynecháme násobení maticí v závorce, čímž se nám zkrátí na tři složky), dostaneme

.

Součin matic sloučíme do jedné, sloučíme podíl koeficientů do jednoho koeficientu a dostáváme konečný vztah pro transformaci bodů jednoho obrazu do druhého

.

Abychom zjistili transformaci všech bodů, stačí znát matici , koeficient lze vypočítat z pravé strany a podmínky, že třetí složka musí být rovna jedné. Matici rozepíšeme na tři řádkové vektory

.

Maticový výraz rozepíšeme do tří rovnic, ve třetí rovnici se na levé straně vyskytuje pouze , tak ji dosadíme do prvé a druhé rovnice. Dostáváme soustavu

.

Tuto soustavu dále rozepíšeme na jednotlivé složky a seřadíme podle indexů položek matice :

Pokud takto sestavíme rovnice pro všechny zadané korespondující body, dostaneme soustavu, jejíž maticový zápis je

.

Matice obsahuje koeficienty dané korespondujícími body, vektor obsahuje prvky matice čtené po řádcích. Je jich 9. Řešení nemusíme mít jediné, stačí nám jednodimenzionální prostor, protože pro různá řešení budou pouze vycházet různé koeficienty . Matice tedy musí mít hodnost 8. Potřebujeme tedy aspoň 4 dvojice korespondujících bodů, pokud nejsou po třech kolineární, přispívá každá ke zvýšení hodnosti matice o 2. Prakticky ale bude řešení složitější, protože jednak nemáme naměřeny body naprosto přesně, což ovlivní hodnost matice, jednak chceme mít možnost použít metodu i na větší počet zadaných korespondujících bodů. Proto se výsledná matice, získaná ze všech (aspoň čtyřech) korespondujících dvojic upraví tak, aby měla hodnost 8 a byla zároveň „blízká“ matici původní. Za míru se zde považuje součet druhých mocnin odchylek všech prvků. Tuto matici lze najít pomocí metody SVD, která jako vedlejší produkt spočte přímo vektor  . Aby SVD pracovala správně, je vhodné, aby rozptyl koeficientů v matici byl co nejmenší. Konstanty v matici jsou nuly a jedničky, volíme standardní normalizaci, která zajistí, aby střední hodnota souřadnic bodů byla nulová a aby souřadnice byly v rozsahu ±1:

,

, ,.

Spojení obrazů

Když známe vzájemné transformace mezi obrazy, můžeme přistoupit ke spojení obrazů. Při připojení bodů obrazu 2 k obrazu 1 se postupuje tak, že se vypočítá výřez (hranice) obrazu 1, kam se obraz 2 bude transformovat. Potom se berou jednotlivé body výřezu obrazu 1 a zpětnou transformací se zjišťuje místo, kam by se promítly do obrazu 2. Určí se barva tohoto místa a ta se nastaví bodu obrazu 1. Jas se určuje dvěma způsoby, buď se najde nejbližší skutečný bod (nejbližší soused), nebo se interpoluje barva ze čtyř nejbližších sousedů. Pokud označíme jasovou funkci obrazu 1 jako I a podobně J u obrazu 2, bude platit:

  1. metodou nejbližšího souseda: ,
  2. bilineární interpolací: , kde .

Závěr

Úlohu jsem ověřil v programu MatLab. Korespondující body jsem vkládal pomocí nástroje CorrGUI. Nejdříve jsem zkusil sestavit obrázky ze zadaných čtyř korespondencí, tím jsem dostal následující výsledek. Na obrázku je zvětšeno místo napojení.

Potom jsem zkoušel volit body tak, abych odstranil shod v napojení. Nejlepší výsledek, jakého jsem dosáhl pro 4 korespondující dvojice bodů, ukazuje další obrázek.

Změnil jsem pořadí a vkládal levý obrázek do pravého.

Při zadání většího počtu se mi nepodařilo dosáhnout lepšího výsledku, než se 4 dvojicemi. Následující obrázek je pro 8 dvojic, z nichž 4 jsou z obrázku minulého.

Je potřeba zadávat body pořádně. Corrgui nabízí zvětšení obou obrázků, takže je možno body trefit s větší přesností. Tento postup se mi osvědčil.

 

 



[1] Vektory, tj. matice n,1, značím malým podtrženým písmenem, matice velkým písmenem.