l'image de fond

fr       en

Détection de Points d'intérêts

Détection de coins SUSAN (SUSAN corner detection algorithm)

Méthode

SUSAN signifie Smallest Univalue Segment Assimilating Nucleus. SUSAN utilise un masque en forme de disque centré sur le pixel à analyser. Pour chaque pixel 'p' compris dans le masque, on effectue la comparaison avec le centre 'pn'(nucleus) grâce à la fonction :

c ( p ) = e - ( I ( p ) - I ( p n ) ) 6 t


où t est le rayon du disque. Puis nous calculons la somme des comparaisons du masque.

n ( p n ) = p c ( p )

Nous utilisons ensuite la comparaison suivante :

R ( p n ) = { g - n ( p n )  if  n(pn)<g  0  elsewhere  }

'g' est appelé seuil géometrique. Si 'g' est assez grand SUSAN devient un detecteur de contours.

Programme

clear all;
close all;
[filename, pathname] = uigetfile({'*.jpg;*.tif;*.png;*.gif;*.bmp','All Image Files';...
          '*.*','All Files' },'mytitle',...
          'C:\Work\myfile.jpg')
img = imread(filename);
img=mean(img,3);

[ligneorigine colonneorigine]=size(img);
%h    = [0 0 1 1 1 0 0
%         0 1 1 1 1 1 0
%         1 1 1 1 1 1 1
%         1 1 1 1 1 1 1
%         1 1 1 1 1 1 1
%         0 1 1 1 1 1 0
%         0 0 1 1 1 0 0];
taille = 3;
h = double(fspecial('disk', taille)>0);
nb1 = sum(sum(h))





%effet de bord
img = wextend(2,'zpd',img,taille);

[ligne colonne]=size(img);
d=zeros(ligne,colonne);

somme=0;
g= 3*nb1/4;
radius = 2*taille;
for i = taille+1 : ligne-(taille+1)
    for j = taille+1 : colonne -(taille+1)
          for l = -taille : taille
              for c = -taille : taille
                  if h(l+taille+1,c+taille+1)
                    inter = (img(i+l,j+c)-img(i,j));
                    somme = somme + exp(-((inter/radius)^6));
                  end
              end
          end
          d(i,j)=somme;
          somme=0;

    end
    i
end

img = img(taille:end-taille-1,taille:end-taille-1);
d = d(taille:end-taille-1,taille:end-taille-1);

[ligne colonne]=size(img);
r=zeros(ligne,colonne);
nmax=max(max(d))*3/4;
nmax=max(max(d))/2;
for i = 1 : ligne
    for j = 1 : colonne
          if d(i,j)== 0
              r(i,j)=nmax;
          elseif d(i,j)< nmax
              r(i,j)=d(i,j);
          else
              r(i,j)=nmax;
          end
    end
end
r=abs(r-nmax);

h=h/sum(sum(h));
r=conv2(r,h,'same');
[zmax,imax,zmin,imin]= extrema2(r);

imshow(uint8(img))

hold on
nb=100;
if length(imax)>nb
    nbcorner = nb;
else
    nbcorner=length(imax);
end
for i = 1 :  nbcorner %length(imax)
    quotien= floor(imax(i)/ligne);
    reste = imax(i) - quotien*ligne;
    plot([quotien-2 quotien-2 quotien+2 quotien+2 quotien-2],...
        [reste-2 reste+2 reste+2 reste-2 reste-2] ,'r','LineWidth',1)
end

Exemple


pointinteret_susan
L'algorithme de SUSAN appliqué en détéction de contours.
pointinteret_susanedge

Copyright © 2010-2014, tous droits réservés, contact : operationpixel@free.fr