29

このテンプレートを探しているとしましょう:

止まる

テンプレートの角は透明なので、背景は次のように変化します。

月に止まる

エベレストに立ち寄る

葉っぱで止まる

テンプレートで次のマスクを使用できると仮定します。

止まる ストップマスク

それを見つけるのはとても簡単でしょう。

私が試したこと:

試してみmatchTemplateましたが、マスクをサポートしていません (私が知る限り)。テンプレートでアルファ チャネル (透明度) を使用しても、これらのピクセルを無視する代わりにアルファ チャネルを比較するため、これは達成されません。

私は解決策になると思った「関心領域」も調べましたが、それでは長方形の領域しか指定できません。それがテンプレートで機能するかどうかさえわかりません。

私はこれが私自身のアルゴリズムを書くことによって可能であると確信していますが、私はこれが可能であることを望んでいました. 標準の OpenCV を使用して、車輪の再発明を回避します。言うまでもなく、それはおそらく私自身のものよりも最適化されているでしょう.

では、OpenCV + Python でこのようなことを行うにはどうすればよいでしょうか?

4

6 に答える 6

9

これは関数のみを使用して実現できます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 のコードはありません。しかし、アイデアは非常に簡単です。

これが役立つことを願っています。

于 2014-07-15T03:34:26.347 に答える
2

あなたの質問に対する 1 つの答えはconvolutionです。テンプレートをカーネルとして使用し、画像をフィルタリングします。

宛先マットには、テンプレートが存在する可能性のある高密度の明るい領域があります。結果をクラスター化する必要があります (例: 平均シフト)。

そのようにして、一般化されたハフ変換またはテンプレートベースの畳み込みマッチングの非常に単純化された実装が得られます。

于 2013-03-19T14:45:54.067 に答える
1

ImageMagick には、他のイメージ内のサブイメージを見つけるためのロジックがあり、非常にうまく機能します。

compare -verbose -dissimilarity-threshold 0.1 -subimage-search subimage bigimage

一部の製品の透かしを見つけてぼかすために使用しました。聞かないでください。

(やるべきことをやらなきゃいけない時もある..)

于 2013-03-19T15:45:24.983 に答える