[ hlavní stránka cvičení | rotace | interpolace | výpočet parametrů | samostatná práce ]

3. cvičení: Geometrické transformace – rotace

V tomto cvičení se budeme zabývat (globálními) geometrickými transformacemi obrázku. Budeme tedy posouvat souřadnice jednotlivých bodů, nikoli jejich jasové hodnoty. Globální znamená, že jednu tranformaci aplikujeme na všechny souřadnice obrazu. Takové tranformace nacházejí velmi široké uplatnění při úpravách fotografií a lze je provádět interaktivně s použitím např. programu GIMP.

Pro jednoduchost se zaměříme na rotaci. Vlastní transformace obrazu má dvě části: transformaci souřadnic bodů a interpolaci jasu v nich. Pokud se snažíme o rektifikaci obrazu do referenčního souřadného systému, musíme nejprve potřebnou transformaci vypočítat.

Rotace

Transformaci souřadnic [x y]' rotací okolo počátku o úhel θ v kladném směru otáčení lze popsat maticově:

Zamyslete se, zda v našem případě stačí rotace okolo počátku. Kladný směr otáčení je definován od kladné první osy ke kladné druhé ose (v našem případě od x k y). Nezapomeňte, že v obraze má osa y opačný směr.

Všimněte si, že jediným maticovým násobením lze transformovat N bodů, stačí je zapsat do jedné matice velikosti 2×N. Kromě lepší přehlednosti to v MATLABu přináší zrychlení oproti cyklu.

Pro vytvoření rotovaného obrazu potřebujeme:

  1. znát velikost, kterou nový obraz v neotočené 2D mřížce zabere
  2. znát souřadnice bodů v mřížce – lze použít funkci meshgrid()
  3. vypočítat, které původní souřadnice odpovídají souřadnicím v mřížce (zpětná transformace)
  4. interpolovat hodnoty z původních dat

Interpolace

MATLAB nabízí pro interpolaci funkci interp2(), kde lze pomocí parametrů vybrat metodu. Implementaci nejjednodušší metody nearest neighbor si můžete vyzkoušet sami.

Výpočet parametrů transformace

Zatím jsme předpokládali znalost parametrů transformace, tu ale například při narovnání našikmo pořízené fotografie předem nemáme. Pokud ale obraz obsahuje výrazné hrany, které chceme natočit do určitého úhlu můžeme Radonovou transformací (doc radon) ve výkonovém spektru nalézt nejčastěji zastoupený směr hran. Rotaci stačí spočítat jako rozdíl mezi tímto a požadovaným směrem.

vstup log(im_Pfft) Radonova transformace
aplikovaná na log(im_Pfft)
hodnoty odpovídající
projekcím počátkem

Radonova transformace – zjednodušené vysvětlení

Radonova transformace provádí 2D→1D projekci intenzit v obraze pod různými úhly. Představte si vodorovné přímky vedené každým řádkem obrazu. V prvním kroku sečteme intenzity podél každé přímky a výsledek uložíme do prvního sloupce výstupní matice. V druhém kroku pootočíme přímky o zadaný úhel, sečteme intenzity podél nich, a výsledek uložíme do druhého sloupce. Takto postupujeme pro zadaný rozsah úhlů, v MATLABu defaultně 0:179 stupňů. Stejnou 2D→1D projekci se změnou úhlu provádí rentgen v počítačové tomografií (CT). My Radonovu transformaci použijeme pro nalezení přímky s nejvyšší intenzitou.

Samostatná práce

Váš kód bude otestován automaticky na sadě obrazů, které nebudete mít při vývoji k dispozici. Je proto důležité:

  1. Implementujte funkci theta = estimaterotation(I), kde I je dvourozměrná matice typu uint8 reprezentující šedotónový obraz s výraznou pravoúhlou strukturou, vychýlenou max. o ±40 stupňů od os obrazu. Výstup theta udává, o jaký úhel (ve stupních v kladném směru x→y) je nutné fotografii otočit, aby struktura souhlasila s osami obrazu. Např. pro tuto fotografii theta = -10. [1.5 bodu + 0.5 bonus dle počtu správně určených obrazů]

  2. Implementujte funkci R = rotationmatrix(theta), která vytvoří rotační matici R 2×2 pro úhel theta stupňů. [0.5 bodu]

  3. Implementujte funkci Ir = rotateimage(I,R), která provede rotaci obrazu zadanou rotační maticí R a vrátí výsledek jako dvourozměrnou matici Ir typu uint8. Nesmí dojít k oříznutí obrazu ani přidání zbytečných okrajů – vypočtěte přesně velikost vzniklého obrazu. Očekáváme vaši vlastní implementaci metody nearest neighbor, nepoužívejte funkce interp2, imrotate, imtransform nebo tformarray. [2 body]

Každý krok je hodnocen nezávisle, tj. i pokud váš algoritmus selže v prvním nebo druhém kroku, dostanete jako vstup do následujícího kroku správné hodnoty. Vyhodnocení uvidíte a budete mít možnost nahrát opravenou verzi. Nedostanete víc bodů, než kolik vám sdělí automatické vyhodnocení. Pokud si myslíte, že nefunguje správně, ozvěte se cvičícím před vypršením termínu odevzdání.


[ ZSO cvičení | Za stránku zodpovědný: Tomáš Svoboda ]