4

normxcorr2テンプレートマッチングのためにMatlabの関数を使用しています。しかし、やりたいこととやっていることは違いnormxcorr2ます。組み込みnormxcorr2関数は、長方形のテンプレート内のすべてのピクセルを考慮して相互相関を計算します。しかし、特定のピクセルのみを正規化された相互相関プロセスに参加させたいと思っています。

たとえば、次の画像のリング状の白い領域だけをテンプレートとして関連付けを行いたいとします。(内部の黒い領域は計算に使用しないでください)

ここに画像の説明を入力

したがって、上記のテンプレートを次の画像と関連付けると、約 1.0 の正規化された値が得られる可能性があります (両方の画像で外側の円が同じ直径であることを考慮してください)。

ここに画像の説明を入力

私はこのソリューションをチェックアウトしました:-行列の0(または1)のみに一致するmatlabテンプレートですが、一般的ではありません。

matlab でより一般的なソリューションを手伝ってくれる人はいますか? これを使用して、オブジェクトを外側の形状で追跡できます

編集:- これは、見たい人のための全体の画像です。内側の詳細ではなく、外側の円形のリムだけでボールを検出したい。

ここに画像の説明を入力

4

2 に答える 2

1

わかりました、試してみましょう... このソリューションは、既存のnormxcorr2実装を使用し、それを変更して夜の問題を解決しようとします。

正規化された相互相関の式は次のとおりです。

ここに画像の説明を入力

この場合、すべてのウィンドウの統合境界を変更する必要があります。これは、標準偏差と相関自体の両方に影響を与える順番です。いくつかのステップでそれに取り組みましょう。

ステップ #1: 適切な相関関係を得る

テンプレート画像を変更することでこれを行うことができます:

template_fix = template;
mean_template_mask = mean(template(mask == 1));
template_fix(mask == 0) = mean_template_mask;
result = normxcorr2(template_fix, query)

この変更を行うことで、テンプレートの平均値がマスク内のテンプレートの平均値と等しくなることに注意してください。この方法では、マスクの外側にあるすべてのテンプレート ピクセルは、平均値に等しいため、統合に寄与しません。

ステップ #2: テンプレート std を修正する

size_mask = sum(mask(:));
size_template = numel(template);
std_template = std2(template);
std_template_masked = sqrt(sum((template_fix(:) - mean_template_mask).^2)/size_mask);
result = result * (std_template/std_template_masked);

ステップ #3: クエリ std を修正する

sum_filt = ones(size(template));
std_query = filter2(query.^2, sum_filt) - filter2(query, sum_filt).^2/size_template;
std_query = sqrt(std_query/size_template);

std_query_mask = filter2(query.^2, mask) - filter2(query, mask).^2/size_mask;    
std_query_mask = sqrt(std_query_mask/size_mask);

result = result .* std_query ./ std_query_mask;

Matlab が応答しないため、実際にテストする機会がありませんでした。いくつかのエラーを見逃していない限り、数学的に同等であるはずです。

このソリューションはいくつかの追加の畳み込みを行いますが、重なり合うピクセルを複数回処理することはありません。

同じテンプレート イメージを複数回使用する場合は、ステップ 1 と 2 をリファクタリングして、前処理のために 1 回だけ実行することができます。どちらも計算コストが高くないはずですが。

別のアプローチ: 単純明快

元の関数を使用しない、別の簡単なアプローチを次に示しnormxcorr2ます。このコードは、読みやすさを犠牲にしてメモリ使用量を簡単に最適化できます。

ここに画像の説明を入力

ここに画像の説明を入力

% q for query, t for template and mask for mask
% shape = 'full' or 'same' or 'valid'

t_mask = t .* mask;
n      = numel(mask);
tq_sum = filter2(t_mask,q, shape);

q_sum  = filter2(mask, q, shape);    
q_mean = q_sum/n;
t_sum  = sum(t_mask(:));
t_mean = t_sum/n;

res1 = tq_sum - t_mean*q_sum - t_sum*q_mean + t_mean*q_mean*n;

t_std = sqrt((sum(t_mask(:).^2) - sum(t_mask(:)).^2/n)/n);
q_std = sqrt((filter2(mask, q.^2, shape) - q_sum.^2/n)/n);

res = res1 ./ (n * t_std * q_std)
于 2014-06-12T20:34:45.730 に答える