私のシナリオは次のとおりです。データベースに1000枚の画像を保存する必要があり、新しい画像とデータベースの画像を比較して一致するか(一致は70%以上である必要があります)、phpでデータベースから最適な画像を取得する必要があります。
より良い結果との高速比較のためのアルゴリズムまたは方法はありますか...
前もって感謝します :)
私のシナリオは次のとおりです。データベースに1000枚の画像を保存する必要があり、新しい画像とデータベースの画像を比較して一致するか(一致は70%以上である必要があります)、phpでデータベースから最適な画像を取得する必要があります。
より良い結果との高速比較のためのアルゴリズムまたは方法はありますか...
前もって感謝します :)
主にパフォーマンス上の理由から、Perceptual Hash などを使用することをお勧めします。本質的には、データベースに画像を挿入した時点で、画像ごとに 1 つの数値またはハッシュを作成し、そのハッシュをデータベースに保持します。次に、挿入する新しい画像を取得したら、そのハッシュを計算し、それを他のすべての画像の PRE-CALCULATED ハッシュと比較します。これにより、既存の画像のすべてのメガバイトのピクセルをディスクからドラッグして比較する必要がなくなります。彼ら。
最適な pHASH は、スケール不変で画像形式不変です。これは Neal Krawetz 博士による記事です... Perceptual Hashing。
ImageMagick は Perceptual Hashing も実行でき、PHP から呼び出すこともできます。こちらを参照してください。
これは、アルゴリズムをどれだけ賢くしたいかによって異なります。
たとえば、次のような問題があります。
トリミングされた画像とトリミングされていない画像 テキストが追加された画像とミラーリングされていない別の画像 これについて私が見た最も簡単で単純なアルゴリズムは、各画像に対して次の手順を実行するだけです。
64x64 や 32x32 などの小さいサイズにスケーリングします。アスペクト比を無視し、最も近いピクセルの代わりに結合スケーリング アルゴリズムを使用します。最も暗い色が黒で最も明るい色が白になるように色の範囲をスケーリングします。最も明るい色が左上になるように画像を回転および反転します。 、次に右上が次に暗く、左下が次に暗い (もちろん可能な限り) 編集 結合スケーリング アルゴリズムは、10 ピクセルを 1 に縮小するときに、これらの 10 ピクセルすべてを 1 つに結合します。平均化、平均値、または双 3 次スプラインなどのより複雑なアルゴリズムで実行できます。
次に、2 つの画像間のピクセル単位の平均距離を計算します。
データベースで一致する可能性のあるものを検索するには、ピクセルの色をデータベースの個々の列として保存し、それらの束 (非常に小さな画像を使用しない限り、すべてではありません) にインデックスを付け、それぞれの範囲を使用するクエリを実行します。ピクセル値、つまり。小さな画像のピクセルが、検索したい画像の -5 から +5 の間にあるすべての画像。
これは実装が簡単で、かなり高速に実行できますが、もちろん、ほとんどの高度な違いを処理することはできません。そのためには、はるかに高度なアルゴリズムが必要です。