Bonjour à tous,

Je suis en train d'implémenter en C++ le détecteur de Harris, et je me pose des questions sur les résultats de mon algorithme.

Voici un pseudo-code l'expliquant :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
Paramètres de ma fonction : img_src : tableau 2D image d'entrée, img_dst : tableau 2D image de sortie, Gauss : valeur de lissage gaussien, k : coefficient 0.04 (peut aller jusqu'à 0.06), threshold : ma valeur de seuil, corner_Harris : un vector remplie avec les coordonées en x et en y de mes points.
 
J'applique la dérivée de Sobel [-1 -2 -1; 0 0 0; 1 2 1] et [-1 0 1; -2 0 2; 1 0 2] pour obtenir deux tableaux 2D des dérivées en x et en y.
 
Si Gauss > 0, j'applique un lissage gaussien selon la valeur de Gauss.
 
Je parcours img_src pour obtenir 3 variables : A, qui correspond aux Ix²; B, qui correspond aux Ixy; et C, qui correspond aux Iy².
 
Je calcule la réponse : réponse = (A * C - B * B) - k * (A + B) * (A + B);
 
Si ma réponse est supérieur à threshold, je garde la valeur (que je ramène entre [0; 255]). Sinon, mon pixel vaut 0.
 
Il faut savoir que le calcul de A, B et C se faite dans une fenêtre 3*3 autour du pixel étudiée.
 
Une fois ce calcul fait sur tous les pixels de l'image, je calcule les maxima locaux pour n'obtenir que les plus forts points. Le calcule est fait sur une fenêtre 3*3 autours du pixel étudié.
 
Je refais un dernier tour pour obtenir la position [x, y] de chaque point pour remplir mon vecteur std::vector, ces points devant être des coins.
Je souhaiterai savoir deux choses : que pensez-vous de mon algo' ? (Je peux mettre une version c++ si besoin).
Est-il possible d'améliorer les résultats ? J'ai l'impression d'avoir des erreurs sur certaines images complexes... notamment l'image de Lena, que j'utilise souvent comme image test. Je n'obtiens rien ! Mais je ne sais si l'erreur est dû à mon calcul de A, B et C, où à ma recherche de maxim locaux.

Merci d'avance pour l'aide/commentaire

Axel