====== Úvod do Matlab-u ====== Na cvičeních z MPV budeme intenzívne využívat programovací prostředí MATLAB. V případě, že jste ještě neprišli do styku s tímhle prostředím, nastudujte si následující části z [[http://www.mathworks.com/access/helpdesk/help/techdoc/learn_matlab/bqr_2pl.html|"Getting started with MATLAB"]]: * Matrices and Arrays - (Expressions, Working with Matrices, More About Matrices and Arrays) * Graphics - (Editing Plots, Mesh and Surface Plots, Images) * Programming - (Flow Control, Other Data Structures, Scripts and Functions) (samostudium doma) ====== Opakování základů zpracování obrazu ====== Další potřebnou součásti přípravy na cvičení z MPV je zvládnutí základů spracování obrazu v jazyku MATLAB. ===== Konvoluce, vyhlazení obrazu a gradient ===== * Gaussián se v zpracování obrazu často používa ako model ideálního bodu, dolnopropustní filtr na odstranění šumu a tzv. okenní funkce, kterou pozorujeme (vážime) okolí bodu v obraze. Implementujte funkci ''G=gauss(x,sigma)'', která vygeneruje diskrétní vzorky Gaussiánu\\ G = \frac{1}{\sqrt{2\pi}\sigma}\cdot e^\frac{-x^2}{2\sigma^2}\\ v bodech daných vektorem x s variancí \sigma^2 a strědní hodnotou 0. * Implementujte funkci ''D=dgauss(x,sigma)'', která vratí diskrétní vzorky první derivace Gaussiánu\\ \frac{d}{dx}G = \frac{d}{dx}\frac{1}{\sqrt{2\pi}\sigma}\cdot e^{-\frac{x^2}{2\sigma^2}} = -\frac{1}{\sqrt{2\pi}\sigma^3}\cdot x\cdot e^{-\frac{x^2}{2\sigma^2}} \\ v bodech daných vektorem x s variancí \sigma^2 a strědní hodnotou 0. * Seznamte se s funkcí ''conv2''. * Efekt filtrování Gaussiánem můžeme prozkoumat na impulzní odezvě: sigma = 6.0; x = [-ceil(3.0*sigma):ceil(3.0*sigma)]; G = gauss(x, sigma); D = dgauss(x, sigma); imp = zeros(51); imp(25,25) = 255; out = conv2(G,G,imp); ... imagesc(out); % nebo surf(out); vyzkoušejte impulzní odezvy na ostatní kombinace Gaussiánu a jeho derivace. * Ukázka impulsních odezev: \\ {{derivatives.png}} \\ * Napište funkci ''out=gaussfilter(in,sigma)'', která aplikuje vyhlazení Gaussovým filtrem o velikosti ''2*(sigma*3.0)+1'' s variancí \sigma^2 na vstupní obrázek //in// a vrátí vyhlazený obrázek //out// (např. [[https://cw.felk.cvut.cz/lib/exe/fetch.php/courses/a4m33mpv/cviceni/1_uvod/lenna.png|Lenna]]). Využijte separability Gaussovského filtru, a vyhlazení implementujte jako dvě konvoluce s 1D Gaussiánem (vid. funkce ''conv2''). * Upravte funkci gaussfilter na ''[dx,dy]=gaussderiv(in,sigma)'', která vrátí odhad gradientu (gx, gy) v každém bodě vstupního obrázku //in// (MxN matice) po vyhlazení Gaussiánem s variancí \sigma^2. Použijte buď derivaci Gaussiánu nebo konvoluci se symetrickou differenci. * ''[dxx,dxy,dyy]=gaussderiv2(in,sigma)'', která vrátí všechy druhé derivace vstupního obrazu //in// (MxN matice) po vyhlazení Gaussiánem s variancí \sigma^2. [[http://www.bmia.bmt.tue.nl/education/courses/FEV/book/index.html|Kapitoly [3,4,5] o Gaussiánu a jeho derivacích a jejich úloze pri zpracování obrazu (další kapitoly)]] ===== Geometrické transformace a interpolace jasové funkce ===== * Napište funkci, ''A=affine(x1,y1,x2,y2,x3,y3)'', která vráti 3x3 matici A, která transformuje body v homogénních souřadnicích z kanonického souřadného systému do obrázku: (0,0,1)->(x1,y1,1), (1,0,1)->(x2,y2,1) a (0,1,1)->(x3,y3,1). \\ {{ affine.png?500 }} \\ * Napište funkci ''out=affinetr(in,A,ps,ext)'', která transformuje výřez obrázku //in// (MxN matice) do kanonického souřadného systému. Afinní transformace //A// (3x3 matice) je transformace z kanonického souřadného systému do obrázku v homogénních souřadnicích. //ps// určuje délku strany výsledního obrázku a //ext// je reálné číslo, velikost výřezu v kanonickém souřadném systému. Příklad: ''out=affinetr(in,A,41,3.0)'', vrátí výrěz obrázku o velikosti 41x41 odpovídajíci okolí (-3.0,-3.0)x(3.0,3.0) v kanonickém souřadném systému. Levý horní roh obrázku má souřadnice (0,0). Použijte bilineární interpolaci. Testujte na [[https://cw.felk.cvut.cz/lib/exe/fetch.php/courses/a4m33mpv/cviceni/1_uvod/img1.png|img1.png]]. \\ {{ affinetr.png?600 }} \\ ==== Co odevzdat ==== Do odevzdávacího systému nahrajte .zip archiv s funkcemi implementovanými v MATLABu: ''gauss.m'', ''dgauss.m'', ''gaussfilter.m'', ''gaussderiv.m'', ''gaussderiv2.m'', ''affine.m'' a ''affinetr.m'' v kořenovém adresáři. Archiv musí obsahovat všechny potřebné použité funkce. Dodržujte pořadí a počet parametrů. ==== Reference ==== [[http://www.cs.princeton.edu/courses/archive/fall00/cs426/lectures/transform/transform.pdf|Geometrické transformace - hierarchie transformací, homogenní souřadnice]]\\ [[http://cmp.felk.cvut.cz/~hlavac/TeachPresCz/11DigZprObr/18BrightGeomTxCz.pdf|Geometrické transformace - opakování z predmětu Digitální obraz]] ===== Kontrola výsledků ===== Pro kontrolu výsledků vašich funkcií jsme použili skript a funkci MATLABu publish. Nakopírujte {{test.m|test.m}} do cesty MATLABu (nebo adresáře s vašimi funkcemi) a spusťte. {{results.zip|Výsledky}} si ověrte na [[http://cmp.felk.cvut.cz/~perdom1/mpv/01_uvod/test.html|referenčním řešení]] (opraveno 16.2.2011, 18:10).