これを行うプログラムを実行する必要があります。画像(5 * 5ピクセル)が与えられた場合、他の多くの画像で構成された別の画像にそのような画像がいくつ存在するかを検索する必要があります。つまり、画像内の特定のパターンを検索する必要があります。
使用する言語はCです。4つの角度(0°、90°、180°、270°)で検索するには、並列計算を使用する必要があります。
それを行うための最良の方法は何ですか?
これを行うプログラムを実行する必要があります。画像(5 * 5ピクセル)が与えられた場合、他の多くの画像で構成された別の画像にそのような画像がいくつ存在するかを検索する必要があります。つまり、画像内の特定のパターンを検索する必要があります。
使用する言語はCです。4つの角度(0°、90°、180°、270°)で検索するには、並列計算を使用する必要があります。
それを行うための最良の方法は何ですか?
簡単そうです。
(0,0)
からまでのすべてのポジション(width - 5, height - 5)
正規化された相関関係を使用して、テンプレートの一致を判断します。
@ Daniel、Danielのソリューションは、複数のCPUを活用するのに適しています。彼は有用な品質指標については言及しておらず、画像処理で非常に一般的な1つの品質指標を提案したいと思います。
-1から+1までの数値を出力するため、比較メトリックとして正規化相関[1]を使用することをお勧めします。0が相関関係にない場合、2つのテンプレートが同一である場合は1が出力され、2つのテンプレートが完全に反対である場合は-1が出力されます。
正規化された相関を計算したら、しきい値テストまたはピークツーアベレージテストのいずれかを実行して、テンプレートが見つかったかどうかをテストできます[2]。
[1-脚注]正規化された相関をどのように実装しますか?これは非常に単純で、forループは2つしかありません。十分に優れた実装ができたら、同じイメージで1が得られるかどうかを確認することで、実装を検証できます。
[2-脚注]max(array)/ average(array_without_peak)の比率を実行します。次に、しきい値を設定して、ピークと平均の比率が良好であることを確認します。
イメージの追加の 3 つのバージョンを作成する必要はありません。別のアドレスを指定するか、ここで作成したクラスのようなものを使用するだけです。さらに良いことに、5x5 マトリックスを複製して、代わりに回転させます。次に、すべての回転について画像を線形にスキャンできます (これは良いことです)。
ボトルネックは確かに画像データへのアクセスであるため、この問題は並列処理には適していません。複数のスレッドが同じデータにアクセスすると、速度が低下します。特に、スレッドが「非同期」になった場合、つまり、1 つのスレッドが他のスレッドよりも画像を先に進み、最初のスレッドが破棄したデータを他のスレッドが再読み込みすることになります。 .
したがって、私が考える最も効率的な解決策は、画像の 5 行をスキャンする 4 つのスレッドを作成することです。1 回転あたり 1 つのスレッドです。5 番目のスレッドは、一度に 1 行ずつ画像データをロードし、その行を 4 つのスキャン スレッドのそれぞれに渡し、4 つのスレッドすべてが完了するのを待ちます。つまり、画像の 1 行をロードし、5 つのライン バッファに追加し、4 つのスキャン スレッドを開始します。 、スレッドが終了するのを待って、すべての画像行が読み取られるまで繰り返します。
5 * 5 = 25
25 ビットは整数に収まります。
各画像は、4 つの整数の配列としてエンコードできます。
より大きな画像を反復処理し (大きすぎないことを願っています)、5 * 5 サブ画像をすべて取り出し、4 つの整数の配列に変換して比較します。