2

我正在努力比较多个图像。我将这些图像数据作为称为“图像”的矩阵的列向量。我想通过首先计算它们的欧几里德距离来评估图像的相似性。然后我想创建一个矩阵,我可以在该矩阵上执行多个随机游走。现在,我的代码如下:

% 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

然而,我的矩阵 M 最终沿其主对角线的值为 1,而其他地方的值为 0。我期待每行的前几个元素的“大”值和列索引> 4的元素的“小”值。有人可以解释什么是错的吗?任何建议表示赞赏。

4

4 回答 4

2

由于您正在尝试计算Euclidean distance,因此您在计算时括号的放置位置似乎有错误normImageTemp。你有这个:

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

但你实际上想要这样做:

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

换句话说,您需要执行逐元素平方,然后是求和,然后是平方根。您现在所做的是首先对元素求和,然后求平方和求和的平方根,这基本上相互抵消(或者实际上相当于只取绝对值)。

顺便说一句,您实际上可以使用函数NORM为您执行此操作,如下所示:

normImageTemp = norm((images(:, i) - images(:, j))./256);
于 2010-11-13T06:16:15.573 回答
0

考虑这个解决方案:

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 和 SQUAREFORM 是来自统计工具箱的函数。

否则考虑这个等效的矢量化代码(仅使用内置函数):

%# 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);

正如其他答案中所解释的那样,D距离矩阵是距离矩阵,而exp(-D)相似度矩阵是相似度矩阵(这就是为什么你会在对角线上得到一个)

于 2010-11-13T09:28:01.730 回答
0

你得到的结果似乎是合理的。回忆一下 exp(-x) 的行为。当 x 为零时,exp(-x) 为 1。当 x 很大时,exp(-x) 为零。

也许如果你让 M(i,j) = normImageTemp; 你会看到你期望看到的。

于 2010-11-13T06:13:04.347 回答
0

有一个已经实现的函数pdist,如果你有一个矩阵A,你可以直接做

辛=正方形(pdist(A))

于 2013-08-01T02:58:20.343 回答