不規則な形状の比較

私はいくつかの行動心理学研究のスコアリングシステムを考え出しています。

私は人々に手紙を描き、グラフィックスタブレットの両方でそれを辿るように頼みます。私はこの痕跡の正確さを評価したいと思います。だから、あなたはどんな手紙( 'a')を描いても、それをやり直してから、それを初めて描いたときのそれに似ています。図面はピクセル位置として記憶される。

正確さは元の手紙との近さとして評価される。この方法では、スケール、回転または位置の変更が可能である必要はありません。概念的には、それは2つの線の間の領域のようであり、線のみが非常に不規則であるため、インテグラルは(私の知る限り)機能しません。

私はMATLABで書いていますが、概念的な助けをいただければ幸いです。私は描かれたすべてのピクセルの間の最小距離を合計しようとしましたが、これはよく配置された単一点に良い(低い)得点を与えます。

これは前に行われていたに違いないが、私は自分の検索で運がない。どんな助けも大変ありがとう!

---以下の@Billで提案されている方法を使った部分的な解決法。 bwdistのグラデーションが急峻すぎるので、うまくいきません。 Billが見せてくれる素敵な第2のイメージではなく、元のイメージに似ています。

%% Letter to image 
im = zeros(1080,1920,3); % The screen (possible pixel locations) 
% A small square a bit like the letter 'a', a couple of pixels wide. 
pixthick = 5; 
im(450:450+pixthick,[900:1100],:) = 1; 
im(550:550+pixthick,[900:1100],:) = 1; 
im([450:550],900:900+pixthick,:) = 1; 
im([450:570],1100:1100+pixthick,:) = 1;
subplot(2,1,1); imagesc(im); %% atransbw = bwdist(im(:,:,1)<0.5); subplot(2,1,2); 
imagesc(atransbw);
5
すでに説明した方法の問題は何ですか? (最短距離の合計)
追加された 著者 Ali,
最短距離を見つけるために1つの値しかないので、1つのポイントは非常に高いスコアをつけることができます。例えば。円の中心に点を想像してください。最短距離の合計は小さく、良いスコアを意味します。実際には非常に悪い痕跡です。
追加された 著者 dgmp88,

5 答え

形状コンテクストは、形状の「極座標ヒストグラム」に基づく強力なフィーチャ記述子です。 Wikipediaページは詳細ですが、ここは、追加情報(およびその技術の視覚的説明)を持つ別のページです。 MATLABデモコード。マッチングする文字は、このメソッドの元のアプリケーションの1つでした。私がリンクしているデモコードでは、トレースベクトルをイメージに変換する必要はありません。

より単純な方法は、2つの文字の排他的論理和として定義される「画像差異」であってもよい。これには、トレースベクトルをバイナリイメージに変換する必要があります。何かのようなもの:

x = xor(im1,im2);
d = sum(x(:))/sum(im1(:)); %# normalize to the first image

最後に、トレースベクトルの点数が同じである場合、またはサンプリングによって作成できる場合は、Procrustes Analysisが便利です。 Procrustes解析の考え方は、2組の点の間で最小二乗最適線形変換(回転、平行移動、スケーリング)を見つけることです。 2つの点集合間の適合度は、「Procrustes統計量」または点の平方根二乗偏差のような他の尺度によって与えられる。

%# Whatever makes sense;
%# procrustes needs N x 2 matrices with (x,y) coords for N points.
coords1 = [x1 y1];
coords2 = [x2 y2];

%# This sampling may be too naive.
n = max( size(coords1,1), size(coords2,1) );
coords1 = coords1(1:n,:);
coords2 = coords2(1:n,:);

%# d is sum-of-squares error
%# z is transformed coords2
%# tr is the linear transformation
[ d, z, tr ] = procrustes( coords1, coords2 );

%# RMS deviation of points may be better than SSE.
n = size(coords1,1);
rmsd = sqrt((sum((coords1(:) - z(:)).^2)/n));
3
追加された
procrustes(X、Y、 'scaling'、false)を使用してスケーリングコンポーネントをオフにすることができます。ポイントのRMSDまたはSSEを直接使用することもできます...
追加された 著者 reve_etrange,
いいアイデア、ありがとう!しかし、1つの問題は、私は、文脈に依存して形作るさまざまな変換に不変性を望んでいないということです。
追加された 著者 dgmp88,
ありがとう、私はそれをテストし、Bill Cheathamが提案したソリューションの別のバージョンと比較します。私は現在取り組んでいます。
追加された 著者 dgmp88,

MATLABで実装されている距離変換は、 bwdist をクリックします。たとえ一致しなくても、これは近くにある行に報酬を与えます。

a_img_1 = imread('a.jpg');
imagesc(a_img_1);

enter image description here

a_img_1_dist_transform = bwdist( a(:, :, 1) < 250 );
imagesc(a_img_1_dist_transform);

enter image description here

2番目の画像でも同じことができ、距離変換画像のピクセル値の差を合計します。次のようになります。

score = sum( abs( a_img_1_dist_transform(:) - a_img_2_dist_transform(:) ) )

(これは、類似度の低い画像とv.v.に高いスコアを与えることに注意してください)

「良い(低い)得点を1点に配置する」という言葉の問題を防ぐために、ピクセル値の2乗のような他の距離測定を試すことができます。

2
追加された
@ dgmp88 - これをタブレットのサイズが与えられた画像に変換することは問題ありません。
追加された 著者 Andrey Rubshtein,
@ dgmp88 - あなたの質問を更新(編集)してください。
追加された 著者 Andrey Rubshtein,
ラスタファイルではなくベクトル画像として保存されていることを意味しますか?その場合、はい、私は確かにこの答えよりも良い方法になります。
追加された 著者 Bill Cheatham,
OK、それを試して実装します - ありがとう!このソリューションの私の唯一の問題は、 '画像'がベクトルとしてのみ格納されるため、非常に高価なことです。申し訳ありませんが、私はあまり明確ではないと思います。画像比較は最良のタグではないかもしれません。それでも、これはうまくいくかもしれません、私は会議の後すぐに試してみます。乾杯! (投票しようとしましたが、私の担当者はまだ高くはありません)
追加された 著者 dgmp88,
画像でもなく、ペンがグラフィックタブレットに触れたピクセル位置の2次元ベクトルです。
追加された 著者 dgmp88,
私はこの基本的なアイデアを使用して終了しましたが、変更されました...私のソリューションは別の答えとして投稿
追加された 著者 dgmp88,

いくつかのエラー基準、たとえば平均二乗誤差と一致するアフィン変換を見つけることができます。このようにして、翻訳とスケーリングを不変にします。また、翻訳のペナルティをかけたい場合は、翻訳コストも追加できます。 (類似しているかそうでないと思われるどのような種類の機能についてより多くの情報を提供すれば、私たちが助けになるでしょう)

さて、効率的な実装は別の問題です。おそらく、あなたは画像登録に目を通すべきです。私はこれが何度も行われたと確信しています。

1
追加された
翻訳とスケーリングに対する不変性は重要ではありません。概念的には、オリジナルとトレースの間の面積を計算するいくつかの方法は完璧です。ペイントでバケツの塗りつぶしツールを使用すると、オリジナルとトレースが逸れている場所ごとに、完璧に見えるようなものがあります。私はアフィン変換と画像登録、歓声を調べます!
追加された 著者 dgmp88,

これは基本的にBill Cheathamの方法を使用する、私の最終的な、複雑すぎる解決策です。すべての助けをありがとう!

% pixLet is the 2D vector contain locations where drawing occurred. First convert it to an image. 

im = zeros(1000,1000); % This is the image
for pix = 2:size(pixLet,1)
    y1 = pixLet(pix-1,2); x1 = pixLet(pix-1,1);
    y2 = pixLet(pix,2); x2 = pixLet(pix,1);
    xyd = round(pdist([x1 y1; x2 y2])*2);
    xs = round(linspace(x1,x2,xyd));
    ys = round(linspace(y1,y2,xyd));
    for linepix = 1:length(xs)
        im(ys(linepix),xs(linepix)) = 1;
    end
end

% Blur the image
blur = fspecial('gaussian',[sz sz],reach);
gausIm = conv2(im,blur,'same');

% I made a function of the above to do this for both the template and the trace.
score = sum(sum(abs(gausIm1-gausIm2)));
1
追加された

私は実際にはるかに高いレベルのソリューションを提案します。何らかの信頼を返すOCR機械学習アルゴリズムを見つける。または、自信がない場合は、出力テキストと実際のテキストとの距離をテストします。
これは、手書きを見て、それを理解しようとする人間のようなものです。信頼度が高いほど、結果は良好です。

0
追加された
OCRソリューションは本当に高いレベルのようです。私はそれが動作すると確信していますが、私は単純な解決策を望んでいる、私は文字を定義するためにピクセル位置のコレクションを使用しています。しかし、はい、私は最後にこれを行う必要があります:)。
追加された 著者 dgmp88,