画像ファイル/URL があり、ソフトウェアで最大 100 個の画像のセット内 (または少なくともその桁数) で検索するようにしたいとします。ソフトウェアが検出するターゲット画像は、指定された画像と「同じ」画像である必要がありますが、いずれかのわずかな処理を「許容」できる必要があります (2 つの画像は異なる方法でトリミングされているか、圧縮されている可能性があります)。異なる)。問題は、検索が行われる前に画像がまったくない場合 (つまり、検索前にインデックスが作成されない場合)、これは実行可能なタスクですか?時間 (比較セットは非常に小さいことに注意してください)。また、可能であれば、このタスクにどのツールを使用できますか? これは、ソフトウェア コンポーネントまたはオンライン サービスである可能性があります (概念実証のためにそれを受け入れることができます)。ここでOpenSURFが私を助けてくれますか? 質問をさらに絞り込むために、どのアルゴリズムを使用するかを尋ねているわけではありません。現時点では、既存のツール/API/サービスを使用したいと考えています。
3 に答える
ソフトウェアが検出するターゲット イメージは、指定されたイメージと「同じ」イメージである必要がありますが、いずれかのわずかな処理を「許容」できる必要があります。
「わずかな処理」に回転が含まれず、「クロッピング」のみが含まれる場合は、単純な相互相関が機能するはずですが、遠近補正、回転、レンズ歪み補正がある場合は、事態はより複雑になります。
この方法は、わずかな色補正に対してはかなり寛容だと思います。とにかく、いつでも両方の画像をグレースケールに変換し、必要に応じてグレースケール バージョンを比較できます。
質問をさらに絞り込むために、どのアルゴリズムを使用するかを尋ねているわけではありません。現時点では、既存のツール/API/サービスを使用したいと考えています。
OpenCV ライブラリから開始できcvMatchTemplate
ます (リンクは C バージョンの API を指していますが、C++ および Python でも使用できます)。切り取った画像をテンプレートとして使用し、すべての画像でそれを探します。
比較する画像に明るい背景に暗い特徴がある場合は、CV_TM_CCOEFF
またはCV_TM_CCOEFF_NORMED
メソッドを使用すると効果的です。どちらも、両方の画像からテンプレート領域の平均を引きます。正規化されたメソッド ( CV_TM_*_NORMED
) は、通常はうまく機能しますが、正規化されていない方法よりも遅くなります。
相互相関の前に画像を前処理することを検討してください。それらを最初に正規化すると、相互相関は、わずかな明るさ/コントラストの変更に対する感度が低くなります。@misha が示唆するように、最初にエッジを検出すると、色/明度の情報が失われますが、輪郭のオーバーラップの結果ははるかに良くなります。
jetxee はあなたを正しい軌道に乗せました。ただし、単純にテンプレート マッチングを使用すると、背景がテンプレート マッチングの結果に干渉するという問題が発生する可能性があります。たとえば、テンプレートが建物で、背景が主に明るい場合 (砂漠の砂など)、明るい背景は常に暗いテンプレートよりも高い相互相関を返すため、テンプレート マッチングは失敗します。この問題の例を次に示します。
それを解決する方法は、リンクにあるものと同じです:
- テンプレートとターゲット画像の両方でエッジ検出を実行します。
- 元のテンプレートと画像を捨てる
- エッジ検出されたテンプレートとエッジ検出されたターゲット イメージを使用してテンプレート検出を実行します。
わずかな処理を許容する限り、エッジ検出ステップがそれを処理します。2 つの画像のエッジが大幅に変更されていない (ぼやけている、光学的に歪んでいない) 限り、このアプローチは機能します。
特にアルゴリズムを探しているわけではないことは知っていますが、それでも、あなたがやろうとしていることを非常に効率的に達成できる次のことを提案させてください...
回転を含む同じ画像のトリミングされたバージョンの場合、Fourier-Mellin変換または対数極変換(芸術的なセミヌードの図面に注意してください-ただし、良いソースです)は、 2 つの画像から別の画像に移動するために必要な操作を決定できます。