Cette détection de coins consiste à analyser chaque pixel de l'image. Il mesure les similarités entre différents patchs voisins grâce
à la somme des différences au carré (sum of squared differences). Plus le résultat est faible plus la similarité est grande.
La première étape consiste à faire une dérivée d'un pixel (x,y) sur les huit directions (u,v) suivantes:
(1,0),(1,1),(0,1),(-1,1),(-1,0),(-1,-1),(0,-1),(1,-1),
puis nous procédons à une étape de lissage des images résultantes. Pour cela une moyenne sur un masque 3x3 a été utilisée.
Ensuite on calcule la matrice C qui est la valeur de la variation au carré la plus faible pour chaque pixel.
Pour terminer, on applique un algorithme de détection de maximums locaux.
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);
[ligne colonne]=size(img);
hori = [1 -1];
vert = hori';
diag1 = [1 0; 0 -1];
diag2 = [0 1; -1 0];
h = conv2(img,hori,'same');
v = conv2(img,vert,'same');
d1 = conv2(img,diag1,'same');
d2 = conv2(img,diag2,'same');
average = ones(3,3); % average filter
hh = conv2(abs(h),average,'same');
vv = conv2(abs(v),average,'same');
dd1= conv2(abs(d1),average,'same');
dd2= conv2(abs(d2),average,'same');
clear h v d1 d2
matmin = cat(3, hh.^2, vv.^2, dd1.^2, dd2.^2);
clear hh vv dd1 dd2
c=min(matmin,[],3);
clear matmin
threshold = max(max(c))*0.3;
c(c<threshold)=0;
[zmax,imax,zmin,imin]= extrema2(c);
imshow(uint8(img))
hold
nb=1000;
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
Copyright © 2010-2014, tous droits réservés, contact : operationpixel@free.fr