Přejít na obsah

Cannyho detektor hran


Realizace cannyho detektoru musí splňovat 3 podmínky

1) Detkce hran - požadujeme aby žadné hrany nechyběli a žadné hrany se neopakovali

2) Nalezení (lokalizace) hran – požadujeme aby poloha hrany byla určena přesně

3) Reagovat na každou hranu právě jednou. Tento požadavek je pouze zesílení 1 podmínky, která může v zašumněnách datech reagovat na stejné hrany vícenásobně .


ad 3) podmínka je realizována filtrovaním obrazu pomocí gausiánu


realizace 2D gaussianu v matlabu :

% vytvoreni gausova filtru

sigma=1; % slouzi k automaticke volbe sirky gausianu, zkuste zmenit na hodnotu napr 10

eps=0.0001;

sirka=1:100;

N=max(find(exp(-(sirka.*sirka)/(2*sigma^2))>eps));

[x,y]=meshgrid(-N:N,-N:N);

gauss2D= exp(-(x.*x + y.*y)/(2*sigma^2));


gauss2D = gauss2D / (2*pi* sigma^2); % normalizace filtru (abychom se s jasem stale pohybovali v rozmezi 0:255 musí být velikost filtru rovna jedné)


figure(1);mesh(gauss2D);

imF=imfilter(im,gauss2D);

figure(2);imshow([im imF])


Vyzkousejte : realizujte filtraci pomoci separabilniho filtru (vytvořte si 1D gausian a filtrujte nejprve ve sloupci a výsledek v radcich)


ad 2) Nyní pomocí druhé derivace nalezneme hrany v obraze. Můžeme použít robertse, sobela nebo použit derivaci gausianu


Derivace

gaussDif=x.*gauss2D;

imDx=imfilter(imF,gaussDif,'replicate');

imDy=imfilter(imF,gaussDif','replicate');


Velikost gradientu

velG = sqrt((imDx.*imDx) + (imDy.*imDy));

velG=velG./max(velG(:)); % normalizace

imshow(velG>0.1*max(velG(:))); % zobraz hrany vetsi nez 10% maximalni hodnoty


ad 1) Abychom splnili tuto podmínku budeme hledat lokální maxima (non-maxima suppression) pri hledaní využijeme směr gradientu, a obraz prahujeme.


% non-maximum supression

pom=velG;

for i=2:size(im,1)-1

for j=2:size(im,2)-1

if imDx(i,j) == 0

smerG=1.5;

else

smerG=(abs(imDy(i,j)/imDx(i,j)));

out(i,j)=smerG;

end

% pokud je smer gradientu mezi 0-23° (0-0.40 rad), 156-180°

% doplnek -0.4 a vic

if (smerG <=0.4 & smerG > -0.4 )

if ( (velG(i,j) < velG (i,j-1)) | (velG(i,j) < velG (i,j+1)) )

pom(i,j)=0;

end

end

% pokud je smer gradientu v rozmezi

if (smerG <= 2.4 & smerG > 0.4 )

if ( (velG(i,j) < velG (i+1,j-1)) | (velG(i,j) < velG (i-1,j+1)) )

pom(i,j)=0;

end

end

% pokud je smer gradientu v rozmezi

if (smerG <= - 0.4 & smerG > -2.4 )

if ( (velG(i,j) < velG (i+1,j+1)) | (velG(i,j) < velG (i-1,j-1)) )

pom(i,j)=0;

end

end

% pokud je smer gradientu v rozmezi

if (abs(smerG) > 2.4 )

if ( (velG(i,j) < velG (i+1,j)) | (velG(i,j) < velG (i-1,j)) )

pom(i,j)=0;

end

end

% prahovani s hysterezi

if pom(i,j) >= prah(2)

pom(i,j)=1;

end

if pom(i,j) < prah(1)

pom(i,j)=0;

end

if pom(i,j) >= prah(1) & pom(i,j) < prah(2)

pom(i,j)=2;

end

 

end % for j

end % for i




text to speech