Hough & Radon transform - cvičení ROZ UTIA - ZOI Adam Novozámský (novozamsky@utia.cas.cz)
Motivace Co to je Houghova transformace a k čemu se používá?: metoda pro nalezení parametrického popisu objektů v obraze detekce jednoduchých objektů v obraze jako jsou přímky, kružnice, elipsy, atd. je používána především pro segmentaci objektů, jejichž hranice lze popsat jednoduchými křivkami aplikace také v 3D vidění 2 / 33
Motivace Aplikace: hledání úběžníků: Detekce hran / objektů: 3 / 33
Houghova transformace Bod v Houghově prostoru (x,y) je suma obrazových bodů náležících objektu s parametry x,y 1 bod v HP = právě 1 přímka v obrázku 4 / 33
HT Algoritmu Pro každý bod v HP Najdu přímku body, které jí náleží Každý bod v obrázku Započtu do všech přímek, kam náleží Tvoří sinusoidu v HP Pozn.: Bod hlasuje pro všechny směry Bod je nezávislý na okolí Výpočet trvá dlouho řád sekund 5 / 33
HT Příklad 6 / 33
HT Příklad hledání úběžníku 7 / 33
Úkol: Napište výpočet HT: otevřete skript houghstud.m a na vyznačené místo doplňte Nápověda I: paramatrizace přímky? : y y ax b y 0 θ r. r = x cos θ + y sin θ [1971]Duda & Hart x 0 x 8 / 33
Úkol: Nápověda I: paramatrizace přímky? : skript na zobrazení přímky je psán pro α = 90 θ, tedy: r = x cos(90 θ) + y sin(90 θ) = x sin α + y cos α v našem případě obrázku je [0,0] vlevo nahoře, takže pokud chceme dosazovat index matice, tak: r = x sin α y cos α x 0 -y 0 θ α r x. -y 9 / 33
Úkol: Napište výpočet HT: otevřete skript houghstud.m a na vyznačené místo doplňte Nápověda II: projděte v obrázku pixel po pixelu pokud je pixel nenulový, tak pro všechny směry přímek, které jím procházejí spočítám jejich vzdálenost od počátku tuto vzdálenost musím přeškálovat na vzdálenost <1,Delek> pro danou vzdálenost a úhel připočtu v matici Hits další zásah (+1) 10 / 33
Úkol: Napište výpočet HT: % projiti vsech pixelu snimku for Y = 1 : size(img,1) for X = 1 : size(img,2) % chci jen nenulove body if ~Img(Y,X) continue end % pro vsechny smery primek prochazejicich bodem pocitam jejich vzdalenost for U = 1 : Uhlu % uhel v radianech Alfa = U / Uhlu * pi; % vzdalenost primky od pocatku v pixelech C = sin(alfa) * X - cos(alfa) * Y; % vzdalenost preskalovana na 1 az Delek V = round(c*pixnadelky + (Delek-1)/2) + 1; % bod s uhlem U ma pro vzdalenost V dalsi hit Hits(V,U) = Hits(V,U) + 1; end end end 11 / 33
Úkol: Napište skript primkysnimku(img, Primek) najde a vykresli primky na snimku použijte kresliprimku.m Nápověda I: 1. detekujte hrany pomocí sobel.m 2. proveďte HT 3. najděte uhel a vzdálenost pro nejvyšší hodnotu 4. převeďte na stupně a pixely 5. vykreslete přímku pomocí kresliprimku.m 6. vynulujte tuto nejvyšší hodnotu v HP včetně malého okolí 7. opakujte bod 3 6 podle počtu hledaných přímek 12 / 33
Úkol: primkysnimku(img, Primek) : function primkysnimku(img, Primek) % primkysnimku(img, Primek) - najde a vykresli primky na snimku Hrany = sobel(img, 400); Hits = houghstud(hrany, 360, 800); zobr(img); % detekce hran % Houghova transformace % nachazeni nejvyznamnejsich primek Uhlopricka = norm(size(hrany)); for I = 1 : Primek waitforbuttonpress; % souradnice nejvetsi hodnoty v matici hitu [V,U] = find(hits == max(hits(:)),1); % prepocet uhlu na stupne Uhel = U / size(hits,2) * 180; % prepocet vzdalenosti na pixely Vzdal = V / size(hits,1) * 2 * Uhlopricka - Uhlopricka; % vykresleni kresliprimku(uhel, Vzdal, size(hrany,2), size(hrany,1)); % vynulovani Hits(U,V) a jeho okoli Hits(max(V-20,1):min(V+20,size(Hits,1)),... max(u-20,1):min(u+20,size(hits,2))) = 0; end 13 / 33
Motivace Co to je Houghova transformace a k čemu se používá?: metoda pro nalezení parametrického popisu objektů v obraze detekce jednoduchých objektů v obraze jako jsou přímky, kružnice, elipsy, atd. je používána především pro segmentaci objektů, jejichž hranice lze popsat jednoduchými křivkami aplikace také v 3D vidění 14 / 33
Radon Transform [Radon 1917] g ρ j, θ k = ඵ f x, y δ x cos θ k + y sin θ k ρ j dxdy y y g ρ j, θ k g ρ, θ k x θ k f x, y L ρ j, θ k x x cos θ k + y sin θ k = ρ j ρ j 15 / 33
Radon Transform [Radon 1917] g ρ j, θ k = ඵ f x, y δ x cos θ k + y sin θ k ρ j dxdy y y g ρ j, θ k g ρ, θ k x g ρ, θ = ඵ f x, y δ x cos θ + y sin θ ρ dxdy f x, y θ k x g ρ, θ = M 1 N 1 f x, y δ x cos θ + y sin θ ρ ρ j x=0 y=0 Illustration f x, y = ቊ A x2 + y 2 r 2 0 otherwise r 2 ρ 2 g ρ, θ = න Ady = g ρ = ቊ 2A r2 ρ 2 ρ r r 2 ρ 2 0 otherwise 16 / 33
Radon Back projection: formal interpretation for a single point, g ρ j, θ k, copying the line L ρ j, θ k onto the empty image with its intensity g ρ j, θ k repeating this process of all values of ρ j in the projected signal f θk x, y = g ρ, θ k = g x cos θ k + y sin θ k, θ k f θ x, y = g x cos θ + y sin θ, θ final image by integrating over all the back-projected images : f x, y = න 0 π f θ x, y dθ ~ π θ=0 f θ x, y laminogram 17 / 33
Radon Back projection: A little trick that almost works! Back Projection 18 / 33
Radon Back projection: A little trick that almost works! Back Projection 19 / 33
Radon [Gonzalez 2008 3rd] Image 1 2 4 32 64 20 / 33
Úkol: Spočítejte Radonovu Transformaci: Spočítejte Radonovu Transformaci obrázku Shepp-Logan phantom pro úhly [0..179] a zobrazte jeho sinogram Použijte Matlab funkce phantom(), radon() 21 / 33
Řešení I = phantom(); theta = 0:179; [R,xp] = radon(i,theta); subplot(1,2,1) obr(i,'nofig'); title('original'); subplot(1,2,2) imshow(r,[],'xdata',theta,'ydata',xp); title(sprintf('sinogram')); xlabel('\theta (degrees)') ylabel('\rho') colormap(gca,hot), colorbar 22 / 33
Úkol: Spočítejte inverzní Radonovu Transformaci: Načtěte si data ze souboru sinograms.mat a zobrazte si všechny tři sinogramy. Poté pomocí funkce iradon() pro ně spočtěte IRT bez filtrace naivní back-projection 23 / 33
Řešení load('sinogram180.mat'); load('sinogram90.mat'); load('sinogram45.mat'); theta = 0:179; I180 = iradon(r180,theta,'none'); theta = theta(1:2:end); I90 = iradon(r90,theta,'none'); theta = theta(1:2:end); I45 = iradon(r45,theta,'none'); subplot(1,3,1) obr(i180,'nofig'); title('theta = [0:179]'); subplot(1,3,2) obr(i90,'nofig'); title('theta = [0:2:179]'); subplot(1,3,3) obr(i45,'nofig'); title('theta = [0:4:179]'); 24 / 33
Úkol: Spočítejte inverzní Radonovu Transformaci: To samé s Ram-Lak filtarcí 25 / 33
Řešení load('sinogram180.mat'); load('sinogram90.mat'); load('sinogram45.mat'); theta = 0:179; I180 = iradon(r180,theta,'ram-lak'); theta = theta(1:2:end); I90 = iradon(r90,theta,'ram-lak'); theta = theta(1:2:end); I45 = iradon(r45,theta,'ram-lak'); subplot(1,3,1) obr(i180,'nofig'); title('theta = [0:179]'); subplot(1,3,2) obr(i90,'nofig'); title('theta = [0:2:179]'); subplot(1,3,3) obr(i45,'nofig'); title('theta = [0:4:179]'); 26 / 33
Děkuji za pozornost! ROZ UTIA - ZOI Adam Novozámský (novozamsky@utia.cas.cz)