16

輪郭のグループを比較するための最良の戦略は何かを知りたいのですが、実際には、どちらのペアがより類似しているかを知るために、2つの写真からのキャニーエッジ検出の結果であるエッジです。

私はこの画像を持っています:

http://i55.tinypic.com/10fe1y8.jpg

そして、これらのどれがそれに最もよく合うかをどのように計算できるか知りたいです:

http://i56.tinypic.com/zmxd13.jpg

(右側にあるはずです)

とにかく全体として輪郭を比較することはありますか?画像を簡単に回転させることはできますが、右側の参照画像が最適であると計算するためにどの関数を使用すればよいかわかりません。

これが私がopencvを使ってすでに試したことです:

matchShapes関数-2つのグレースケール画像を使用してこの関数を試しましたが、すべての比較画像で常に同じ結果が得られ、値が0,0002であるため、値が間違っているように見えます。

したがって、matchShapesについて私が気付いたのは、それが正しい仮定であるかどうかはわかりませんが、関数は完全な画像ではなく、輪郭のペアで機能するということです。比較したい画像の輪郭はありますが、それらは数百であり、どれを「ペアリング」する必要があるのか​​わからないため、これは問題になります。

そのため、最初の画像のすべての輪郭を他の2つの輪郭と繰り返し比較しようとしました、たとえば、5の輪郭を2つの参照画像の円の輪郭と比較している可能性があります。2つの輪郭は比較していません。

また、単純なcv :: compare関数とmatchTemplateを試しましたが、どれも成功しませんでした。

4

1 に答える 1

20

さて、これには、アプローチがどれだけ堅牢である必要があるかに応じて、いくつかのオプションがあります。

単純な解決策(仮定あり):

これらの方法では、提供した画像が作業中のものであると想定しています(つまり、オブジェクトはすでにセグメント化されており、ほぼ同じスケールです。また、回転を(少なくとも大まかに)修正する必要があります) 。10、30、60、または90度ごとに比較画像を繰り返し回転するようなことをするかもしれません。あるいは、あなたが逃げることができると感じるどんな粗さでも。

例えば、

for(degrees = 10; degrees < 360; degrees += 10)
    coinRot = rotate(compareCoin, degrees)
    // you could also try Cosine Similarity, or even matchedTemplate here.
    metric = SAD(coinRot, targetCoin) 
    if(metric > bestMetric)
        bestMetric = metric
        coinRotation = degrees

  • 絶対差の合計(SAD):これにより、おおよその回転角を決定した後、画像をすばやく比較できます。
  • コサイン類似性:これは、画像を1Dベクトルとして扱い、2つのベクトル間の高次元角度を計算することにより、動作が少し異なります。一致が良いほど、角度は小さくなります。

複雑なソリューション(おそらくより堅牢):

これらのソリューションは実装がより複雑になりますが、おそらくより堅牢な分類が得られます。


  • Haussdorf Distance:この回答は、この方法の使用方法を紹介します。このソリューションを正しく機能させるには、おそらく回転補正も必要になります。
  • フーリエメリン変換:この方法は、位相相関の拡張であり、2つの画像間の回転、スケール、および平行移動(RST)変換を抽出できます。
  • 特徴の検出と抽出:この方法では、画像内の「ロバストな」(つまり、スケールや回転不変)特徴を検出し、RANSAC、LMedS、または単純な最小二乗法を使用して一連のターゲット特徴と比較します。OpenCVには、matcher_simple.cppmatching_to_many_images.cppでこの手法を使用したサンプルがいくつかあります。注:この方法では、画像を2値化する必要がない可能性があるため、より多くの検出可能な機能を利用できます。
于 2011-10-24T00:49:18.300 に答える