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 :
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