これは関数のみを使用して実現できますmatchTemplate
が、少し回避策が必要です。
デフォルトのメトリクスを分析しましょう( CV_TM_SQDIFF_NORMED
)。matchTemplate のドキュメントによると
、デフォルトのメトリックは次のようになります
R(x, y) = sum (I(x+x', y+y') - T(x', y'))^2
I
は画像行列、はT
テンプレート、R
は結果行列です。合計はテンプレート座標で行わx'
れy'
、
W
そこで、と同じ次元を持つ
重み行列 を挿入して、このメトリックを変更しましょうT
。
Q(x, y) = sum W(x', y')*(I(x+x', y+y') - T(x', y'))^2
この場合、設定W(x', y') = 0
することで実際にピクセルを無視することができます。では、そのようなメトリックを作成するにはどうすればよいでしょうか? 簡単な計算で:
Q(x, y) = sum W(x', y')*(I(x+x', y+y') - T(x', y'))^2
= sum W(x', y')*(I(x+x', y+y')^2 - 2*I(x+x', y+y')*T(x', y') + T(x', y')^2)
= sum {W(x', y')*I(x+x', y+y')^2} - sum{W(x', y')*2*I(x+x', y+y')*T(x', y')} + sum{W(x', y')*T(x', y')^2)}
Q
そのため、メトリクスをツリーごとの合計に分割しました。matchTemplate
そして、これらの合計はすべて、関数を使用して (CV_TM_CCORR
メソッドを使用して)計算できます。すなわち
sum {W(x', y')*I(x+x', y+y')^2} = matchTemplate(I^2, W, method=2)
sum{W(x', y')*2*I(x+x', y+y')*T(x', y')} = matchTemplate(I, 2*W*T, method=2)
sum{W(x', y')*T(x', y')^2)} = matchTemplate(T^2, W, method=2) = sum(W*T^2)
最後の要素は定数なので、最小化には何の効果もありません。一方、テンプレートが完全に一致するかどうかを確認することは、依然として有用です (Q がゼロに近づいている場合)。それにもかかわらず、最後の要素についてはmatchTemplate
、直接計算できるため、実際には関数は必要ありません。
最終的な疑似コードは次のようになります。
result = matchTemplate(I^2, W, method=2) - matchTemplate(I, 2*W*T, method=2) + as.scalar(sum(W*T^2))
本当に定義どおりに動作しますか? 数学的にそうです。matchTemplate
関数は 32 ビット浮動小数点で動作するため、実際には多少の丸め誤差がありますが、大きな問題ではないと思います。
によって提供される任意のメトリックに対して、分析を拡張し、同等の重み付けを行うことができることに注意してくださいmatchTemplate
。
これは実際に私にとってはうまくいきました。申し訳ありませんが、実際のコードを提供しません。私は R で作業しているため、Python のコードはありません。しかし、アイデアは非常に簡単です。
これが役立つことを願っています。