2011-01-21 232 views
24

OpenCVはテンプレートマッチングの際に画像の透過を処理する方法は何ですか?OpenCVのテンプレートマッチングと透過性

問題は、元の画像にはそれらの場所に何かがある可能性があるため、テンプレート画像に透明部分が必要であるということです。

すべての方法を試しましたが、いずれも肯定的な結果をもたらしませんでした(元の画像のテンプレートの位置が正しく検出されなかったなど)。

編集: OK、これは例を示すために必要です。

Original image

Template image

あなたが見ることができるように、それはそのようなイメージに、このようなテンプレートと一致することはほぼ不可能です。オブジェクトの周りの「背景」任意の色かもしれない(このような、または白、茶色...)

Sobel on grayscaled image & template + cvConvertScaleAbs

Additional original image

編集2:ミーシャのソリューションものビットで動作します周囲の障害物(「透明性」が働く)。例:

Template match sucessful

編集3 - 複数の出現箇所:私は、テンプレートの複数の出現箇所を見つけるの迅速かつ汚いソリューションを作った

テンプレートが見つからない場合は、しかし、私は "取得偽陽性の "ロット"。主な理由は私の実装の画像データ

    • 反復(画像データ[Y、xは、0]> = maxValueの* 0.95f)それは一致 (maxValueのように、[X、Y]をカウントした場合そこに、少なくとも一つの正の一致だが上がisn't such template、画像のためのひどい状況になり際に、画像のための

    それにworks)cvMinMaxLocからです。

  • +0

    最大値にしきい値を設定します。しきい値を下回っている場合、画像にテンプレートは含まれません。あなたは経験的に閾値の尺度を決定しなければならないでしょう。 – misha

    +4

    画像が見つかりません。 =( –

    +0

    @anatolytechtonik申し訳ありませんが、もう私はそれらを持っていません(5年経ちました)。 – mnn

    答えて

    15

    OpenCVはあなたが望むようにアルファを処理しているようではありません。あなたのアルファチャンネルは、最初のオプション以来

    無関係になるよう

  • は、あなたのイメージを変換するアルファチャンネルを使用する独自の相互相関法を書く

    1. 2つのオプションがあります簡単ですが、私はここで2番目のオプションを探求します。 a similar questionより前に私が提供したサンプルコードを再利用するつもりです。画像に相互相関を直接適用すると、背景がテンプレートマッチング(特に明るい背景部分)に干渉します。カラーチャンネルで遊ぶと、青いチャンネルでのマッチングが正しい結果をもたらすことがわかります。これは画像の内容に依存し、問題を解決する一貫した方法ではありません。

      もう1つの方法は、画像とテンプレートでエッジ検出(例:Sobel)を実行して相互相関を実行することです。ここでは、エッジで検出された画像があります(GIMPのLumaチャンネルでSobelエッジ検出器を使用してから、強度ストレッチを行います)。

      map

      building

      あなたが見ることができるように地形のほとんどがゼロ強度となっていると、相互相関計算に寄与しないよう、ここではアルファチャネルは、無関係となっています。だから今の相互相関は、直接、望ましい結果を与える、適用することができます。

      [email protected]:~/Desktop/stackoverflow$ python cross-correlation.py map-blue.png building-maskz-blue.png 
      (163, 244) 
      

      を最後に、ここでanother related questionです。

      PS。これはどんなゲームですか?

  • +0

    ありがとうございましたが、グレースケール画像とテンプレートでSobelを使用して同じ結果を得られませんでした(質問を参照)。イメージは古いDOSのゲーム - 地球2140です。 – mnn

    +0

    あなたのイメージがうまくいかなかった理由は、エッジがないエリアは**ブラックではありません**(127ニュートラルグレーです)。それらを私の画像と比較する。エッジ以外の領域は**ゼロ**にする必要があるため、相互相関の計算に干渉しません。 – misha

    +0

    OK、非エッジ領域をゼロにするには、cvConvertAbsScaleを使用しました。 (質問を参照)しかし、まだ私のSobelはあなたと同じではありません(特にテンプレート)。私はOpenCVを使用していて、GIMPを使ってSobelを使用していたのでしょうか? – mnn

    0

    私はあなたがOpenCVで何をしようとしているのは、マスクとのテンプレートマッチングです。テンプレート上でROI(関心領域)を設定しようとするといいでしょう。 This SO question shows how to do it。 (その質問ではROIはテンプレートではなくターゲットイメージに設定されていますが、手順は同じです)。

    +0

    興味深いですが、私はそのような地域に検索を絞り込むことができないので、本当に助けにはなりません – mnn

    +0

    右ですが、テンプレートそのものには透過的な(つまり、テンプレートのROI内にあるべきではない)ピクセルと透過的でない(つまり、テンプレートのROIにある)ピクセルがあります。 @Utkarsh Shinhaが言っているように、ROIにないピクセルを無視する独自のテンプレートマッチング関数を書かなければならないということが、最悪の事態です。 – carlosdc

    +0

    サンプル画像を見てください。透明領域はどのような形でも長方形ではありませんROIは長方形です – mnn

    0

    わかりませんが、透明チャンネルは他のチャンネルと同様に扱われます。テンプレート内のピクセルが「透明」である場合、それは主画像上でも「透明」でなければならない。私はちょうどここで推測しています。

    +0

    それは問題です。私はテンプレートと一致する必要があります_ignore_ピクセルのtranspaテンプレート画像のレンシ。さもなければ、私はオリジナルの画像でテンプレートを見つけることができません。なぜなら元の画像では、私が探しているオブジェクトの周りに何かがあるからです。 – mnn

    +0

    両方で透明度チャンネルを取り除きます。それはうまくいくかもしれない。または、独自のテンプレートマッチング機能を記述することもできます。 OpenCVのドキュメントには、さまざまな方法で使用される数式が記載されています。ピクセルで透明度を「尊重」するように、それらを変更することができます。 –

    +0

    Utkarash、あなたは正しいです:あなたはただの推測です。しかし、現実の世界は、あなたが推測するよりはるかに複雑です。与えられた公式を使用してピクセルごとにテンプレートと画像を比較する独自のマッチング関数を書くと、スピードに最適化されたC++であっても、これは遅い(1分まで実行する)ことはできません。 OpenCVが非常に高速である理由は、matchTemplate()でDFT(フーリエ変換)を使用するためです。しかし、このコードは数学者だけが理解するほど非常に複雑であり(コメントはありません)自分のmatchTemplate()関数を書くのを忘れてください! – Elmue

    1

    アルファチャンネルを黒のRGBカラーに置き換えようとすると、SQDIFF/SQDIFF_Nオプションが解決されます。 少なくともこれは同じ問題に対する私の解決策でした。私の結果から、この方法はより明るいピクセル値に敏感であることは明らかであり、私はその機会をとった。

    -1

    私は同じ問題を抱えていました。私は解決策を考えました。 ReferenceImageMaskとtemplateMaskに良いピクセルは1、悪いピクセルは0になっています。そのreferenceImageとtemplateImageはすでにマスクされており、不良ピクセルにも0が含まれています。

    次に、テンプレートマッチングの最初の結果は、画像間の正規化されていない相互相関を示します。しかし、ピクセルの束はゼロでした。

    2番目のテンプレートマッチングでは、両方の画像でゼロ(マスクされていない)とは異なる時点のピクセル数が、それぞれのオフセットに対して与えられます。

    次に、その数値による相関を正規化すると、あなたと私が求めていた値が得られるはずです。両方の画像でマスクされていないピクセルの平均積。

    Image<Gray, float> imCorr = referenceImage.MatchTemplate(templateImage,  Emgu.CV.CvEnum.TM_TYPE.CV_TM_CCORR); 
    Image<Gray, float> imCorrMask = referenceImageMask.MatchTemplate(templateMask, Emgu.CV.CvEnum.TM_TYPE.CV_TM_CCORR); 
    _imCorr = _imCorr.Mul(_imCorrMask.Pow(-1)); 
    

    更新:実際には、この解決策は機能しません。 opencvでの相互相関の実装ではDFTが使用されるため、数値的な問題があり、最初のものを修正するために2番目の相互相関を使用することはできません。

    +0

    ありがとうございました。しかし、私はこれ以上作業していません。うまくいけば、これは他の人にも役立つでしょう。 – mnn

    9

    私はこの問題に対して、実際にはうまくいくように思われます。テンプレート画像のアルファチャンネルをノイズに置き換えます。ノイズによって、マッチング処理中に透明領域が統計的に重要ではありません。

    たとえば、私の使用例では、iOSの画面キャプチャで絵文字を検索していました。コンテキストに応じてiOSのキーボードの背景が色を変えるため、テンプレート画像の特定の背景色に合わせると、マッチング処理に問題が発生します。ここ

    アルファに生テンプレート画像です:
    raw template image on alpha

    ここでノイズはアルファチャンネルのために充填で処理テンプレートの:
    enter image description here

    私が提供Template Matching sample code介して処理テンプレート画像を送信しましたOpenCVのドキュメント暗い背景または明るい背景のいずれにおいても、合致は妥当な確信をもって見出される。透明テンプレートのアルファチャンネルを残して、比較で

    matched on light

    - または暗いまたは明るい背景にコミットする:光背景に検索

    matched on dark

    暗い背景上の検索 - 受け入れ可能なマッチを返しませんでした。

    +1

    あなたの解決策はうまく機能しない回避策です。通常、matchTemplate()は、画像が同一であれば確実に99%または100%の一致を返しますが、サンプル画像を含むソリューションは、一致する画像に対して23%の確度を返します。次の一致しない画像(スマイリーの1つ)は11%です。これは、マッチング(23%)と非マッチング(11%)の間の非常に悪い距離です。そして、スマイリーはあなたのテンプレートイメージよりも完全に別のものです。この回避策は、一致と不一致の区別に使用するしきい値に強く依存します。あなたの解決策は非常に弱い結果をもたらします – Elmue

    +2

    よりよい回避策は次のようになります:最初のステップであなたのメソッド(ノイズの付いたテンプレート)を使用してmatchTemplate()との一致の可能な場所を探し、次に2番目のステップで透明部分を黒にマスクします最初のステップで見つかった場所のテンプレートとメイン画像の両方で、実際の確信度(最大100%)を取得します。 – Elmue

    +1

    絵文字の周りの無駄なノイズを取り除くと、より確実な結果が得られます。あなたはノイズの上下16ピクセルと各サイドに5ピクセルを持っています。それらを除去した後、確実性は23%から57%に増加する。より多くの騒音が認識を悪化させる! – Elmue

    6

    OpenCV 3.0は、マスクされたテンプレートとのテンプレートマッチングをネイティブサポートしています。 new documentationを参照してください:

    パラメータ:

    画像...

    TEMPL ...

    結果...

    方法...

    mask検索されたテンプレートのマスク。それは、templと同じデータ型とサイズを持たなければなりません。デフォルトでは設定されていません。マスクされた参照画像(拡大画像)とのマッチングテンプレート

    [若干余談]

    注しかし不可能です。 OpenCVはFFTベースのテンプレートマッチングを使用しているので、それは理にかなっています。

    したがって、参照画像の特定の領域でのみテンプレートマッチングを実行する必要がある場合は、独自のメソッドを実装するか、cv :: matchTemplateの出力をマスクする必要があります。

    これをゼロから実装すると、非常に特定の地域(つまり、ハリスコーナー周辺)でのみテンプレートを検索したい場合があります。

    +0

    ありがとうございます!他のすべての答えは、それを使用する適切な方法を検索するときには数学のバーフです。 – Zoey

    関連する問題