点パターン認識


46

2つの異なるサイズのポイント(簡単にするために2D)の2つの異なるサイズを2つの異なるサイズの正方形に分散させると、問題は次のとおりです。

1- 小さいものから大きいものまでを見つける方法
2-次の図に示すように、発生をランク付けする方法についてのアイデアはありますか?

質問の簡単なデモンストレーションと望ましい解決策は次のとおりです。 ここに画像の説明を入力してください


更新1:
次の図は、調査中の問題のもう少し現実的なビューを示しています。 ここに画像の説明を入力してください

コメントに関して、次のプロパティが適用されます。

  • ポイントの正確な位置が利用可能です
  • ポイントの正確なサイズが利用可能です
    • サイズはゼロ(〜1)=ポイントのみ
  • 白い背景にすべてのポイントが黒です
  • グレースケール/アンチエイリアシング効果はありません

以下にendolith、いくつかの小さな変更を加えてで提示したメソッドの実装を示します(回転が小さくて高速なので、ソースではなくターゲットを回転しました)。以前にそれについて考えていたので、「endolith」の答えを受け入れました。RANSACについて私はこれまで経験がありません。さらに、RANSACの実装には多くのコードが必要です。 ここに画像の説明を入力してください


1
そのようなドットを一致させるためのソリューション、またはより複雑な写真を探していますか?写真にはいくつの点がありますか?

ええ、それは非常に重要です。既知のサイズの単なるドットの場合は、そのために最適化できます。あなたがコントロールできる基準マーカーであれば、そのために最適化できます。これを何に使用するかについて、より具体的にしてください。
エンドリス

私が取り組んでいる問題には、ポイントのセット(それぞれ数百ポイント)があり、その中でサイズの小さな別のポイントセット(たとえば<100)が求められています。上記のデモンストレーションは非常に単純で明確ですが、実際の問題は複雑に見えます。また、それらの間に存在する望ましくないポイントに基づいてランク付けされた一致を見つけることにも関心があります。
開発者

1
白黒のドットだけがありますか?あなたはそれらをカメラ/スキャナー/何かから入手していますか?バイナリ値を使用すると、計算がはるかに高速になります。
エンドリス

ドットの中心を見つけるのに問題がありますか、それともドットの位置を知っている全体像のミニチュアを見つけるのに問題がありますか?

回答:


17

これは最善の解決策ではありませんが解決策です。より良いテクニックを学びたい:

画像を回転または拡大縮小しない場合は、画像の単純な相互相関を使用できます。大きな画像で小さな画像が発生する場所に明るいピークがあります。

FFTメソッドを使用すると相互相関を高速化できますが、小さなソースイメージと大きなターゲットイメージを一致させるだけの場合、ブルートフォース乗加算メソッドの方が(通常ではありませんが)速くなります。

ソース:

ここに画像の説明を入力してください

ターゲット:

ここに画像の説明を入力してください

相互相関:

ここに画像の説明を入力してください

2つの明るいスポットは一致する場所です。

しかし、あなたがないあなたの例の画像で回転パラメータを持っているので、それはそれだけでは動作しません。スケーリングのみではなく回転のみが許可されている場合でも、相互相関を使用できますが、相互相関、ソースの回転、ターゲットイメージ全体との相互相関、再回転などが必要です。すべての回転。

これは必ずしも画像を見つけるとは限らないことに注意してください。ソース画像がランダムノイズであり、ターゲットがランダムノイズである場合、正確に正しい角度で検索しない限り、それは見つかりません。通常の状況では、おそらく検出されますが、画像のプロパティと検索する角度によって異なります。

このページは、それがどのように行われるかの例を示していますが、アルゴリズムを示していません。

合計がしきい値を超えるオフセットは一致します。ソースイメージをそれ自体と相関させ、すべての合計をこの数で割ることにより、一致の良さを計算できます。完全に一致するのは1.0です。

ただし、これは非常に計算量が多く、おそらくドットのパターンを一致させるためのより良い方法があります(これについて知りたい)。

グレースケールとFFTメソッドを使用した簡単なPythonの例:

from __future__ import division
from pylab import *
import Image
import ImageOps

source_file = 'dots source.png'
target_file = 'dots target.png'

# Load file as grayscale with white dots
target = asarray(ImageOps.invert(Image.open(target_file).convert('L')))

close('all')
figure()
imshow(target)
gray()
show()

source_Image = ImageOps.invert(Image.open(source_file).convert('L'))

for angle in (0, 180):
    source = asarray(source_Image.rotate(angle, expand = True))
    best_match = max(fftconvolve(source[::-1,::-1], source).flat)

    # Cross-correlation using FFT
    d = fftconvolve(source[::-1,::-1], target, mode='same')

    figure()
    imshow(source)


    # This only finds a single peak.  Use something that finds multiple peaks instead:
    peak_x, peak_y = unravel_index(argmax(d),shape(d))

    figure()    
    plot(peak_y, peak_x,'ro')
    imshow(d)

    # Keep track of all these matches:
    print angle, peak_x, peak_y, d[peak_x,peak_y] / best_match

1色のビットマップ

ただし、1色のビットマップの場合、これははるかに高速です。相互相関は次のようになります。

  • ソース画像をターゲット画像の上に配置
  • ソース画像を1ピクセル移動する
    • ビットごとのANDすべての重複ピクセル
    • すべての1を合計する
  • ...

グレースケール画像をバイナリにしきい値処理し、これを行うことで十分な場合があります。

点群

ソースとターゲットが両方ともドットのパターンである場合、より高速な方法は、各ドットの中心を見つけ(既知のドットと1回相互相関してからピークを見つけ)、それらをポイントのセットとして保存し、ソースを一致させることです2つのセットの最も近いポイント間の最小二乗誤差を回転、変換、および検索することにより、ターゲットを設定します。


1
そうです、調査中の問題にはスケーリングはありませんが、回転は発生する可能性があります。リンクと回答をありがとう。
開発者

@Developer:さて、これでうまくいきますが、おそらくもっと良い方法があります。ただし、それが単なるバイナリイメージの場合、相互相関ははるかに高速になります。(バイナリ信号のFFTのようなものはありますか?)回転は任意ですか?あなたは、など1度、または5度、ずつ増加と同様に、良好な結果を与える回転値のセットを試してみる必要があるだろう
endolith

1
はい、それはバイナリの問題です。また、どこかで、振幅の異なる長い信号で変調された短い信号を見つける方法があったことを覚えています。複雑さに関係なく、非常にうまく機能していたので、ピックポイントを発生の開始点として示しました。問題は2Dにあるため、同様の概念の使用方法は明確ではありません。これは、2Dで適用される回転のためにも複雑です。
開発者

1
ええ、回転の自由度を追加すると、これは実行不可能になります。これがRANSACのようなメソッドが開発された理由です。これについてはDSPボックスの外側を考えると役立つと思います。
マットM.

@MattM .:動作しますが、遅いだけです。:)
エンドリス

22

コンピュータービジョンの観点から:基本的な問題は、ターゲットポイントセットと大規模なセット内のポイントのサブセット間のホモグラフィを推定することです。あなたの場合、回転のみで、それはアフィンホモグラフィになります。RANSACメソッドを調べる必要があります。多くの外れ値を持つセットで一致を見つけるように設計されています。そのため、2つの重要なキーワード、ホモグラフィRANSACが用意されています。

OpenCVはこれらのソリューションを計算するためのツールを提供しますが、MATLABを使用することもできます。OpenCVを使用しRANSACの例を次に示します。そして別の完全な実装

典型的なアプリケーションは、写真の中の本の表紙を見つけることです。本の表紙の写真と、テーブルの上の本の写真があります。アプローチは、テンプレートマッチングを行うのではなく、各画像の顕著な角を見つけ、それらのポイントセットを比較することです。あなたの問題はこのプロセスの後半のように見えます-大きなクラウドでポイントセットを見つけます。RANSACは、これを堅牢に行うために設計されました。

ここに画像の説明を入力してください

データが非常にクリーンであるため、相互相関法も使用できると思います。問題は、回転に別の自由度を追加すると、メソッドが非常に遅くなることです。


質問にもう少し詳細を追加しました。あなたのリンクを深くチェックしますが、それらは異なる概念であるという簡単な印象でした!
開発者

1
それは確かにRANSAC / homographyの問題のように見えます:)
マットM.

まあ。それは私にとって新しい概念でした。できるだけ早く試してみます。私が困難に直面した場合、私はあなたと素晴らしい、協力的なコミュニティメンバーと共有します。
開発者

簡単なQ:RANSAC / homographyメソッドを3D点群に適用することは可能ですか?
開発者

これは有効な解決策ではありません。質問には残念ながら強度情報が含まれていないため、単純な記述子スキームは機能しません。問題はそれよりもむしろ幾何学的です。
トルガバーダル

3

パターンがスパースバイナリの場合、画像の代わりに座標ベクトルの単純な共分散を行うことができます。左上に並べ替えられたサブウィンドウ内のポイントの座標を取得し、すべての座標からベクトルを作成し、左上に並べ替えられたパターンのポイントの座標で作られたベクトルと共分散を計算します。重みを使用することもできます。その後、大きなウィンドウ内のいくつかのグリッド(および回転角度のグリッド)で最大共分散を求めるブルートフォース最近傍探索を行います。検索で近似座標を見つけた後、再加重最小二乗法でそれらを調整できます。

PS Ideaは、画像を操作する代わりに、ゼロ以外のピクセルの座標を操作できます。一般的な最近傍検索。グリッドを使用して、平行移動と回転の両方のすべての検索スペースを徹底的に検索する必要があります。これは、座標と回転角度のステップです。座標/角度ごとに、ウィンドウ内のピクセルのサブセットを取得し、その座標をその角度に回転させた座標を取得し、それらの座標を取得して(中心に対して)、シークするパターンのピクセルの座標と比較します。両方のセットで、ポイントが同じ方法でソートされていることを確認する必要があります。最小差(最大共分散)を持つ座標を見つけます。その大まかな一致の後、いくつかの最適化方法で正確な一致を見つけることができます。申し訳ありませんが、それ以上簡単に中継することはできません。


1
あなたのアイデアをさらに説明した例を挙げてください。あなたの答えの現在のバージョンは私を混乱させています。
開発者

3

Generalized Hough Transformファミリーのメソッドに誰も言及していないのは非常に驚きです。彼らはこの特定の問題を直接解決します。

ここに私が提案するものがあります:

  1. テンプレートを取得し、Rテーブルを作成して、テンプレートのエッジにインデックスを付けます。選択したエッジは次のとおりです。

ここに画像の説明を入力してください

  1. 一般化されたハフ変換のデフォルトのOpenCV実装を使用して、以下を取得します。 ここに画像の説明を入力してください

一致する場所がマークされています。この方法は画像の強度を必要としないため、エッジが単一のポイントに減少しても、同じ方法は機能します。

さらに、回転の処理はハフスキームにとって非常に自然です。実際、2Dの場合、アキュムレータに追加された次元にすぎません。あなたがそれを本当に効率的にするための詳細に行きたい場合のために、M。Ulrichは彼の論文で多くのトリックを説明しています。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.