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の値を持ち、他の場所ではゼロになります。各行の最初のいくつかの要素には「大きい」値、列インデックスが4より大きい要素には「小さい」値を期待しています。誰かが何が悪いのか説明してもらえますか?アドバイスをいただければ幸いです。

4

4 に答える 4

2

ユークリッド距離を計算しようとしているので、を計算するときに括弧を配置する場所にエラーがあるようです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

あなたが得ている結果は合理的なようです。exp(-x) の動作を思い出してください。x がゼロの場合、exp(-x) は 1 です。x が大きい場合、exp(-x) はゼロです。

おそらく、M(i,j) = normImageTemp; を作成すると、あなたが見たいものを見るでしょう。

于 2010-11-13T06:13:04.347 に答える
0

既に実装されている関数 pdist があります。行列 A がある場合は、直接実行できます。

Sim= squareform(pdist(A))

于 2013-08-01T02:58:20.343 に答える
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 は、Statistics Toolbox の関数です。

それ以外の場合は、次の同等のベクトル化されたコード (組み込み関数のみを使用) を検討してください。

%# 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 に答える