2016-09-18 1 views
0

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?

Répondre

0

Il y a 16 nombre de sous-fenêtre 4 * 4 dans la fenêtre 16 * 16 et tous les éléments de la fenêtre 16 * 16 ont des valeurs de 1 à 8 de sorte qu'un histogramme doit être créé séparément pour chaque sous-fenêtre. Cela signifie que dans une boucle, la fonction hist doit être appelée 16 fois. Au lieu de pouvoir ajouter un nombre à chaque sous-fenêtre, les valeurs de chaque sous-fenêtre deviennent différentes des autres sous-fenêtres.

par exemple pour la première sous-fenêtre on ajoute 0 à la valeur binned si les valeurs vont de 1 à 8.

pour la deuxième sous-fenêtre on ajoute 8 à la valeur binned si les valeurs vont de 9 à 16.

pour la troisième fenêtre ajouter 16 .....

Puis une seule fois la fonction hist sera appelée et 128 valeurs seront calculées.

% exmaple of a 16 * 16 window 
binned_16 = randi([1 8],16 ,16); 
% the values to be added to each 16* 16 window ;this matrix only one time needs to be computed 
values_to_add = kron(reshape((0 : 15), 4, 4)*8 , ones(4)); 
% values added to the window 
binned_added_values = values_to_add + binned_16; 
% histogram computed 
h = hist(binned_added_values(:), 1:128);