2

Je travaille à la comparaison de plusieurs images. J'ai ces données d'image en tant que vecteurs de colonne d'une matrice appelée "images". Je veux évaluer la similarité des images en calculant d'abord leur distance euclidienne. Je veux ensuite créer une matrice sur laquelle je peux exécuter plusieurs marches aléatoires. En ce moment, mon code est le suivant:Comment créer une matrice de similitude dans MATLAB?

% clear 
% clc 
% close all 
% 
% load tea.mat; 

images = Input.X; 

M = zeros(size(images, 2), size (images, 2)); 

for i = 1:size(images, 2) 
    for j = 1:size(images, 2) 
     normImageTemp = sqrt((sum((images(:, i) - images(:, j))./256).^2)); 

     %Need to accurately select the value of gamma_i 
     gamma_i = 1/10; 

     M(i, j) = exp(-gamma_i.*normImageTemp); 
    end 
end 

Ma matrice M cependant, finit par avoir une valeur de 1 le long de sa diagonale principale et des zéros ailleurs. J'attends de "grandes" valeurs pour les premiers éléments de chaque ligne et de "petites" valeurs pour les éléments avec un index de colonne> 4. Quelqu'un pourrait-il expliquer ce qui ne va pas? Tout conseil est apprécié.

Répondre

0

Les résultats que vous obtenez semblent raisonnables. Rappelez-vous le comportement de l'exp (-x). Lorsque x est zéro, exp (-x) vaut 1. Lorsque x est grand exp (-x) est nul. Si vous faites M (i, j) = normImageTemp; vous verriez ce que vous attendez de voir.

2

Puisque vous essayez de calculer un Euclidean distance, il semble que vous ayez une erreur dans l'emplacement de vos parenthèses lorsque vous calculez normImageTemp. Vous avez ceci:

normImageTemp = sqrt((sum((...)./256).^2)); 
        %# ^--- Note that this parenthesis... 

Mais vous voulez vraiment faire ceci:

normImageTemp = sqrt(sum(((...)./256).^2)); 
        %# ^--- ...should be here 

En d'autres termes, vous devez effectuer la mise au carré-élément par élément, puis la somme, puis la racine carrée . Ce que vous faites maintenant est d'additionner les éléments en premier, puis en prenant la racine carrée de la somme, qui s'annulent l'un l'autre (ou qui sont en fait l'équivalent de la valeur absolue).

Soit dit en passant, vous pouvez réellement utiliser la fonction NORM pour effectuer cette opération pour vous, comme ceci:

normImageTemp = norm((images(:, i) - images(:, j))./256); 
0

Tenir compte de cette solution:

I = Input.X; 

D = squareform(pdist(I'));  %'# euclidean distance between columns of I 
M = exp(-(1/10) * D);    %# similarity matrix between columns of I 

PDIST et SQUAREFORM sont des fonctions de la boîte à outils Statistiques .

Sinon considérer cet équivalent du code vectorisé (en utilisant uniquement des fonctions intégrées):

%# we know that: ||u-v||^2 = ||u||^2 + ||v||^2 - 2*u.v 
X = sum(I.^2,1); 
D = real(sqrt(bsxfun(@plus,X,X')-2*(I'*I))); 
M = exp(-(1/10) * D); 

Comme nous l'avons expliqué dans les autres réponses, D est la matrice de distance, tandis que exp(-D) est la matrice de similarité (ce qui explique pourquoi vous obtenez ceux sur la diagonale)

+0

en relation: http://stackoverflow.com/q/11059274/97160, http://stackoverflow.com/q/7696734/97160, http://stackoverflow.com/q/6989442/97160 – Amro

0

il y a un si vous avez pdist fonction déjà mis en œuvre, une matrice a, vous pouvez directement faire

Sim = squareform (pdist (a))

Questions connexes