4

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

グラフィックタブレットで、文字を描いてから、その上をなぞってもらいます。このトレースの精度を評価したいと思います。つまり、任意の文字('a')を描画してから、もう一度実行します。次に、最初に描画したときとの類似度に基づいてスコアを付けます。図面はピクセル位置として保存されます。

正確さは、元の文字に近いと評価されます。この方法では、スケール、回転、または位置の変更を考慮する必要はありません。概念的には、2つの線の間の領域のようなもので、線だけが非常に不規則であるため、(私の知る限り)積分は機能しません。

私はMATLABで書いていますが、概念的な助けをいただければ幸いです。描画されたすべてのピクセル間の最小距離を合計しようとしましたが、これにより、適切に配置された単一のポイントに良い(低い)スコアが得られます。

これは以前に行われたに違いありませんが、検索がうまくいきません。

---以下の@Billによって提案された方法を使用した部分的な解決策。bwdistのグラデーションが急すぎるため、機能しません。ビルが示す素敵な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);
4

5 に答える 5

3

形状コンテキストは、形状の「極ヒストグラム」に基づく強力な機能記述子です。ウィキペディアのページは詳細ですが、ここに追加情報(およびテクニックの優れた視覚的説明)とMATLABデモコードが記載された別のページがあります。文字のマッチングは、このメソッドの元々のアプリケーションの1つであり、リンク先のデモコードでは、トレースベクトルを画像に変換する必要はありません。

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

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

最後に、トレースベクトルに同じ数のポイントがある場合、またはサンプリングによって作成できる場合は、プロクラステス解析が役立つ可能性があります。プロクラステス解析の考え方は、2セットの点の間で最小二乗最適線形変換(回転、平行移動、スケーリング)を見つけることです。2つのポイントセット間の適合度は、「プロクラステス統計」またはポイントの二乗平均平方根偏差などの他の測定値によって与えられます。

%# 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));
于 2012-02-06T22:55:35.457 に答える
2

あなたを助けることができるのは、MATLABでとして実装された距離変換bwdistです。これは、たとえ一致していなくても、近くにある線に報酬を与えます。

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

ここに画像の説明を入力してください

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

ここに画像の説明を入力してください

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

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

(これにより、類似性の低い画像とvvのスコアが高くなることに注意してください)

「適切に配置された単一のポイントに対する良い(低い)スコア」について言及する問題を防ぐために、ピクセル値間の距離の2乗など、他の距離測度を試すことができます。

于 2012-02-06T15:34:26.153 に答える
1

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

さて、効率的な実装は別の問題です。おそらく、画像登録を検討する必要があります。私はこれが何度も行われたと確信しています。

于 2012-02-06T16:13:35.430 に答える
1

これは、基本的に 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)));
于 2012-02-09T14:00:08.170 に答える
0

私は実際にはもっと高レベルの解決策を提案します。ある種の信頼を返すOCR機械学習アルゴリズムを見つけてください。または、自信がない場合は、出力テキストと実際のテキストの間の距離をテストします。
これは、手書きを見て理解しようとする人間のようなものです。信頼度が高いほど、結果は良くなります。

于 2012-02-06T16:21:38.473 に答える