Je tente de construire élégamment un descripteur de caractéristique SIFT comme décrit dans paper de Lowe dans MATLAB. La plupart des méthodes que j'ai vues ont été plutôt désordonnées, et je veux trouver une manière élégante de faire ceci. J'ai mes points-clés comme interpolé (x, y) des coordonnées, et nous avons déterminé la grandeur de gradient et d'orientation à tous les pixels dans mon image en utilisant:Utilisation d'une matrice d'indices pour construire un vecteur de caractéristique SIFT dans MATLAB
[Gmag,Gdir]=imgradient(image)
I peut facilement trouver la fenêtre de 16x16 du gradient sur chaque keypoint en tranchant Gdir
. J'ai maintenant besoin de construire les histogrammes de chaque cellule. J'utilise le code suivant pour obtenir un numéro de casier pour chaque orientation/amplitude:
binned=discretize(local_Gdir,[-180:45:180])
binned
est maintenant une matrice d'indices correspondant au vecteur de caractéristique pour chaque cellule (il est rempli de numéros 1-8, les indices du binned
correspondent aux indices de gradient locaux).
Afin de construire le descripteur de caractéristique de 128 éléments, j'ai besoin de déterminer les vecteurs caractéristiques (histogrammes) des 16 cellules. J'ai essayé de diviser la matrice binned
en 16 cellules tout en préservant les indices de sorte que je puisse rapidement me référer à la matrice d'amplitude de gradient locale pour additionner les gradients dans chaque bin pour chaque cellule avant de les ajouter dans le descripteur final, mais je peux Ne trouvez pas un moyen propre de le faire. Comment puis-je utiliser la matrice d'indices pour construire les 16 vecteurs de caractéristiques des 16 cellules? Peut-être plus généralement, quel est un bon moyen de diviser une matrice d'index en seize sous-matrices sans perdre les indices de ligne/colonne d'origine?