Implémenter un détecteur d'angle Harris
Je suis la mise en œuvre de Harris coin détecteur à des fins éducatives mais je suis coincé à la harris réponse de la partie. Fondamentalement, ce que je fais, c'est:
- Calculer l'intensité de l'image des gradients dans les x - et y-direction
- Flou de sortie de (1)
- Calculer Harris réponse sur la sortie de (2)
- Supprimer les non-maximas en sortie de (3) dans un 3x3-quartier et le seuil de sortie
1 et 2 semblent bien fonctionner; cependant, je reçois de très petites valeurs comme la Harris réponse, et aucun point n'atteignent le seuil. L'entrée est un standard de la photographie en plein air.
[...]
[Ix, Iy] = intensityGradients(img);
g = fspecial('gaussian');
Ix = imfilter(Ix, g);
Iy = imfilter(Iy, g);
H = harrisResponse(Ix, Iy);
[...]
function K = harrisResponse(Ix, Iy)
max = 0;
[sy, sx] = size(Ix);
K = zeros(sy, sx);
for i = 1:sx,
for j = 1:sy,
H = [Ix(j,i) * Ix(j,i), Ix(j,i) * Iy(j,i)
Ix(j,i) * Iy(j,i), Iy(j,i) * Iy(j,i)];
K(j,i) = det(H) / trace(H);
if K(j,i) > max,
max = K(j,i);
end
end
end
max
end
Pour la photo de l'échantillon, max finit par être 6.4163 e-018 qui semble bien trop faible.
source d'informationauteur Etan
Vous devez vous connecter pour publier un commentaire.
Un coin Harris angle de détection est définie comme la valeur la plus élevée de pixels dans une région" (généralement
3X3
ou5x5
) afin que votre commentaire à propos de ne point atteindre un "seuil" me semble étrange. Juste recueillir tous les pixels qui ont une valeur plus élevée que tous les autres pixels de l'5x5
quartier autour d'eux.En dehors de cela:
Je ne suis pas sûr à 100%, mais je pense que vous devriez avoir:
K(j,i) = det(H) - lambda*(trace(H)^2)
Où lambda est une constante positive qui fonctionne dans votre cas (et Harris valeur suggérée est de 0,04).
En général, la seule raisonnable moment pour votre filtre d'entrée est avant ce point:
[Ix, Iy] = intensityGradients(img);
Filtrage
Ix2
Iy2
etIxy
n'a pas beaucoup de sens pour moi.De plus, je pense que votre exemple de code qui est faux ici (n'fonction
harrisResponse
ont deux ou trois variables d'entrée?):La mise en œuvre proposée est terriblement inefficace.
Permet de' démarrer après le calcul des gradients (qui peut être optimisé trop):
Pas de boucles nécessaires, parce que Matlab déteste les boucles.
Fondamentalement, Harris angle de détection aura 5 étapes:
Si vous êtes à la mise en œuvre dans MATLAB, il sera facile de comprendre l'algorithme et obtenir les résultats.
Le code suivant de MATLAB peut vous aider à résoudre vos doutes:
La solution que j'ai mis en place avec python, ça marche pour moi, j'espère que vous trouverez ce que vous cherchez
Il y a une fonction pour que, dans la Vision par Ordinateur Système de boîte à outils appelée
detectHarrisFeatures
.