わかりました、試してみましょう... このソリューションは、既存の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)