すべての画像を他のすべての画像と非常に高速に比較するには、多くの画像(既存の約100.000、1日あたり新しい1000、RGB、JPEG、最大サイズ800x800)のフィンガープリントを作成する必要があります。ほぼ同じような画像も認識される必要があるため、バイナリ比較メソッドを使用できません。
最善の方法は既存のライブラリですが、既存のアルゴリズムへのヒントも私に役立ちます。
すべての画像を他のすべての画像と非常に高速に比較するには、多くの画像(既存の約100.000、1日あたり新しい1000、RGB、JPEG、最大サイズ800x800)のフィンガープリントを作成する必要があります。ほぼ同じような画像も認識される必要があるため、バイナリ比較メソッドを使用できません。
最善の方法は既存のライブラリですが、既存のアルゴリズムへのヒントも私に役立ちます。
回答:
通常のハッシュまたはCRC計算アルゴリズムは、画像データではうまく機能しません。情報の次元的な性質を考慮する必要があります。
アフィン変換(スケーリング、回転、変換、フリッピング)を考慮に入れるなど、非常に堅牢なフィンガープリントが必要な場合は、画像ソースでラドン変換を使用して、画像データの規範的なマッピングを作成できます-これを各画像と一緒に保存し、次に、指紋のみを比較します。これは複雑なアルゴリズムであり、気弱な人には向いていません。
いくつかの簡単な解決策が可能です:
明度ヒストグラム(特にRGBコンポーネントに分離されたもの)は、画像の妥当なフィンガープリントであり、非常に効率的に実装できます。1つのヒストグラムを別のヒストグラムから差し引くと、新しいヒストグラムが生成されます。これを処理して、2つの画像がどの程度類似しているかを判断できます。ヒストグラムは、明度/色情報の分布と発生を評価するだけなので、アフィン変換が非常にうまく処理されます。各カラーコンポーネントの明度情報を8ビット値に量子化する場合、ほとんどすべての妥当なサイズのイメージのフィンガープリントには、768バイトのストレージで十分です。画像の色情報が操作されると、輝度ヒストグラムは偽陰性を生成します。コントラスト/明るさ、ポスタリゼーション、カラーシフトなどの変換を適用すると、輝度情報が変化します。
スケーリングされた画像を使用することは、画像の情報密度を比較しやすいレベルに下げる別の方法です。元の画像サイズの10%未満に縮小すると、通常、使用する情報が多すぎて失われるため、800x800ピクセルの画像を80x80に縮小しても、適切なフィンガープリントを実行するのに十分な情報を提供できます。ヒストグラムデータとは異なり、ソース解像度のアスペクト比が異なる場合は、画像データの異方性スケーリングを実行する必要があります。つまり、300x800の画像を80x80のサムネイルに縮小すると、画像が変形し、300x500の画像(非常によく似ている)と比較すると、偽陰性が発生します。サムネイルフィンガープリントは、アフィン変換が関係する場合に、しばしば偽陰性を生成します。画像を反転または回転させると、
両方の手法を組み合わせることは、賭けをヘッジし、偽陽性と偽陰性の両方の発生を減らすための合理的な方法です。
ここで提案されている一般的なフレーバーを保持する縮小された画像バリアントよりもアドホックなアプローチははるかに少ないですが、何が起こっているかについてより厳密な数学的基礎を提供します。
テイクハールウェーブレット画像のを。基本的に、Haarウェーブレットは、低解像度の画像から高解像度の各画像への一連の違いですが、ミップマップの「ツリー」内の深さによって重み付けされます。計算は簡単です。次に、Haarウェーブレットに適切な重みを付けたら、k個の最大係数(絶対値に関して)を除いてすべて破棄し、ベクトルを正規化して保存します。
これらの正規化されたベクトルのうち2つのドット積をとると、1がほぼ同一であるという類似性の尺度が得られます。詳細情報を投稿しましたこちらました。
画像比較のために、このphpプロジェクトがあります:https : //github.com/kennethrapp/phasher
そして私の小さなjavascriptクローン:https : //redaktor.me/phasher/demo_js/index.html
残念ながら、これは「ビットカウント」ベースですが、回転した画像を認識します。JavaScriptのもう1つのアプローチは、キャンバスを使用して画像から輝度ヒストグラムを作成することでした。キャンバス上のポリゴンヒストグラムを視覚化し、データベース内のそのポリゴンを比較できます(例:mySQL空間...)
Compare()
最初に画像をダウンロードする代わりに、画像のURIを関数に渡してほしいと思います。また、私のテストでは、「非常に類似した画像」のしきい値は> 98%ではなく> 90%である必要があります。
昔、私はいくつかの類似した特性を持つシステムに取り組みました、そしてこれは私たちが従ったアルゴリズムの近似です:
したがって、各画像n + 1
について、整数値を格納します。n
で、は追跡しているゾーンの数です。
比較のために、各カラーチャネルを個別に確認する必要もあります。
これにより、一致しない画像をすばやく破棄できます。より多くのゾーンを使用したり、アルゴリズムを再帰的に適用したりして、一致の信頼性を高めることもできます。
したがって、「画像照合」とはかなり異なる「指紋照合」を実行したいとします。指紋の分析は過去20年間に深く研究されており、適切な検出率を保証するためにいくつかの興味深いアルゴリズムが開発されています(FARおよびFRR指標- 誤認率および誤認率)。)。
LFA(Local Feature Analysis)クラスの検出手法をよりよく調べることをお勧めします。主に特徴点の検査に基づいて構築されています。特徴点は指紋の特定の特性であり、いくつかのクラスに分類されています。ラスターイメージをマニューシャマップにマップすることは、実際にはほとんどの公的機関が犯罪者やテロリストを提出するために行うことです。
詳細はこちらをご覧ください
iPhone画像の比較と画像の類似性の開発については、http: //sites.google.com/site/imagecomparison/をご覧ください。
実際の動作を確認するには、iTunes AppStoreでeyeBuy Visual Searchをチェックしてください。
2015年現在(将来に戻る...現在Googleで上位にランク付けされている2009年の質問について)、画像の類似性はディープラーニング技術を使用して計算できます。自動エンコーダーと呼ばれるアルゴリズムのファミリーは、類似性を検索可能なベクトル表現を作成できます。ここにデモがあります。
これを行う方法の1つは、画像のサイズを変更して解像度を大幅に(おそらく200x200に?)下げ、比較を行うための小さい(ピクセル平均)バージョンを保存することです。次に、許容しきい値を定義し、各ピクセルを比較します。すべてのピクセルのRGBが許容範囲内にある場合は、一致しています。
最初の実行はO(n ^ 2)ですが、すべての一致をカタログ化すると、新しい画像はそれぞれ比較するO(n)アルゴリズムになります(以前に挿入した各画像と比較するだけで済みます)。しかし、比較する画像のリストが大きくなるにつれて、最終的には機能しなくなりますが、しばらくの間は安全だと思います。
400日間実行すると、500,000の画像が得られます。つまり、(画像のサイズを変更する時間を割り引く)200(H)*200(W)*500,000(images)*3(RGB)
= 60,000,000,000の比較になります。すべての画像が完全に一致している場合、遅れることになりますが、そうではないでしょうか?単一の比較がしきい値を超えるとすぐに、画像を一致として割引できることを覚えておいてください。
特殊な画像ハッシュアルゴリズムは活発に研究されている領域のようですが、おそらく画像バイトの通常のハッシュ計算でうまくいくでしょう。
同じソースから派生したが、形式や解像度が異なる可能性がある画像を探すのではなく、バイトが同一の画像を探していますか(かなり難しい問題として私を襲います)。