l'image de fond

fr       en

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

Détection de coins FAST (Features from Accelerated Segment Test)

Méthode

FAST signifie Features from Accelerated Segment Test. FAST utilise un cercle autour du pixel central comme base de calcul. Prenons pour exemple les pixels suivants où pc est le pixel central.



Nous prenons le cercle de taille 3 pour obtenir un vecteur de 16 pixels représenté ci-dessous.



Une fois ce vecteur en notre main, nous allons pour chaque pixel du vecteur faire la différence entre lui-meme et le pixel central. Un seuil haut et un seuil bas sont ensuite choisis autour de la valeur du pixel central. On va définir trois états selon le résultat de la différence :

Afin de comprendre l'algorithme, prenons l'exemple suivant :



Si on applique l'algorithme précédent, nous obtenons le vecteur suivant :



Nous pouvons remarquer que pour détecter un coin, une succession de onze 1 doit être contenue dans le vecteur. Il en va de même pour une suite de onze -1. Afin de rendre la détection plus flexible, l'algorithme que je propose détecte des suites de 10 à 12 points.

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);
if length(size(img))>2
    img=mean(img,3);
end
[ligneorigine colonneorigine]=size(img);

%effet de bord
taille=3;
img = wextend(2,'zpd',img,taille);
dolong=0;
[ligne colonne]=size(img);
resultat = zeros(ligne,colonne);
for i = taille+1 : ligne-(taille+1)
    for j = taille+1 : colonne -(taille+1)
        p = img(i,j);
       
        threshold_haut = p+50;
        threshold_haut(threshold_haut>255)=255;
       
        threshold_bas = p-50;
        threshold_bas(threshold_bas<0)=0;
         
        v=[img(i-3,j) img(i-3,j+1) img(i-2,j+2) img(i-1,j+3) img(i,j+3) img(i+1,j+3) img(i+2,j+2) img(i+3,j+1) ...
           img(i+3,j) img(i+3,j-1) img(i+2,j-2) img(i+1,j-3) img(i,j-3) img(i-1,j-3) img(i-2,j-2) img(i-3,j-1)] ;
        v(v<threshold_bas)=-1;
        v(threshold_bas<=v & v<=threshold_haut)=0;
        v(threshold_haut<v)=1;
        v2=[v v];
        v=[img(i-3,j) img(i-3,j+1) img(i-2,j+2) img(i-1,j+3) img(i,j+3) img(i+1,j+3) img(i+2,j+2) img(i+3,j+1) ...
           img(i+3,j) img(i+3,j-1) img(i+2,j-2) img(i+1,j-3) img(i,j-3) img(i-1,j-3) img(i-2,j-2) img(i-3,j-1)] ;
        for ilong = 1 : 16
            if (sum(v2(ilong:ilong+9)) == 10) && (sum(v2(ilong:ilong+10)) ~= 11)
                resultat(i,j)= 1;
            elseif (sum(v2(ilong:ilong+10)) == 11) && (sum(v2(ilong:ilong+11)) ~= 12)
                resultat(i,j)= 1;
            elseif (sum(v2(ilong:ilong+11)) == 12) && (sum(v2(ilong:ilong+12)) ~= 13)
                resultat(i,j)= 1;  
            elseif (sum(v2(ilong:ilong+9)) == -10) && (sum(v2(ilong:ilong+10)) ~= -11)
                resultat(i,j)= 1;
            elseif (sum(v2(ilong:ilong+10)) == -11) &&  (sum(v2(ilong:ilong+11)) ~= -12)
                resultat(i,j)= -1;
            elseif (sum(v2(ilong:ilong+11)) == -12) &&  (sum(v2(ilong:ilong+12)) ~= -13)
                resultat(i,j)= -1;
            end
        end
    end
 
    i
end

resultat = resultat(taille:end-taille-1,taille:end-taille-1);
img = img(taille:end-taille-1,taille:end-taille-1);
figure(  'Name','corner detection FAST',...
         'NumberTitle','off',...
         'color',[0.3137 0.3137 0.5098]);
imshow(uint8(img))
hold on
[ligne colonne]=size(img);
for i = 1 :  ligne
    for j = 1 : colonne
        if resultat(i,j)==1
            plot([j-2 j-2 j+2 j+2 j-2],...
                 [i-2 i+2 i+2 i-2 i-2] ,'r','LineWidth',1)
        elseif resultat(i,j)==-1
            plot([j-2 j-2 j+2 j+2 j-2],...
                 [i-2 i+2 i+2 i-2 i-2] ,'g','LineWidth',1)
        end
    end
end
 

voici un exemple de résultat

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