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
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:
|
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 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é:
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ů]
Implementujte funkci R = rotationmatrix(theta)
,
která vytvoří rotační matici R
2×2
pro úhel theta
stupňů.
[0.5 bodu]
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í.