与えられた一連の画像を互いに類似度で並べ替える高速な方法は何ですか。
現時点では、2つの画像間でヒストグラム分析を行うシステムがありますが、これは非常に費用のかかる操作であり、やり過ぎです。
最適には、各画像にスコア(たとえば、RGB平均などの整数スコア)を与えるアルゴリズムを探しており、そのスコアで並べ替えることができます。同一のスコアまたは隣り合うスコアは、重複する可能性があります。
0299393
0599483
0499994 <- possible dupe
0499999 <- possible dupe
1002039
4995994
6004994
画像あたりのRGB平均は最悪ですが、似たようなものはありますか?
画像検索と類似性測定に関する多くの研究がありました。簡単な問題ではありません。一般に、単一のint
では、画像が非常に似ているかどうかを判断するには不十分です。偽陽性率が高くなります。
ただし、多くの研究が行われているため、その一部をご覧になることをお勧めします。たとえば、 このペーパー (PDF)は、大量のデータを保存せずに、重複した画像をすばやく見つけるのに適したコンパクトな画像フィンガープリントアルゴリズムを提供します。堅牢なものが必要な場合、これはrightアプローチのようです。
もっとシンプルで、間違いなくアドホックなものを探しているなら、 this SO question にはいくつかのまともなアイデアがあります。
RGBヒストグラムの使用から離れることを検討することをお勧めします。
画像の2d Haarウェーブレット(音よりもはるかに簡単で、平均化が多く、係数の重み付けに使用される平方根)を取得して、kの最大値を保持すると、画像のより良いダイジェストを取得できますウェーブレット内の重み付き係数をスパースベクトルとして、正規化して保存し、サイズを縮小します。少なくとも知覚的な重みを使用してR GとBを再スケーリングする必要があります。または、重要性を抑えてクロミナンス情報をサンプリングできるように、YIQ(または量子化ノイズを避けるためにYCoCg)に切り替えることをお勧めします。
これらの疎な正規化されたベクトルの2つのドット積を類似性の尺度として使用できるようになりました。最大のドット積を持つ画像のペアは、構造が非常に似ています。これには、サイズ変更、色相シフト、透かし入れにわずかに耐性があり、実装が非常に簡単でコンパクトであるという利点があります。
Kを増減することで、ストレージと精度を犠牲にすることができます。
単一の数値スコアによるソートは、この種の分類問題では扱いにくいものになります。考えてみると、画像は1つの軸に沿ってのみ「変更」できる必要がありますが、変更できません。これが特徴のベクトルが必要な理由です。 Haarウェーブレットの場合、画像で最もシャープな不連続が生じるおおよその場所です。ペアワイズで画像間の距離を計算できますが、距離メトリックだけであるため、線形順序付けでは、すべて等しい距離にある3つの画像の「三角形」を表現する方法がありません。 (つまり、すべてが緑の画像、すべてが赤の画像、すべてが青の画像について考えてください。)
つまり、問題の実際の解決策には、所有する画像の数に対してO(n ^ 2)操作が必要です。一方、メジャーを線形化することが可能であった場合、O(n log n)のみ、またはメジャーが基数ソートに適している場合はO(n)のみ)が必要な場合があります。実際には、セット全体をふるいにかける必要はないため、O(n ^ 2)を費やす必要はなく、あるしきい値よりも近いものを見つける必要があるだけです。疎なベクトル空間を分割するには、すべての画像をすべての画像と単純に比較するよりも、「特定のしきい値よりも似ている画像のkを見つける」問題のはるかに速い漸近線を取得し、必要なものを提供します...正確にあなたが求めたものではありません。
いずれにしても、数年前にこれを使用して、保存していたさまざまなテクスチャの数を最小限にしようとしたときに個人的に良い効果を出しましたが、このスペースには多くの研究ノイズがあり、その効果を示しています(この場合は比較しています)より高度な形式のヒストグラム分類へ):
http://www.cs.princeton.edu/cass/papers/spam_ceas07.pdf
検出の精度を高める必要がある場合は、Haarウェーブレット(またはヒストグラム)でminHashおよびtf-idfアルゴリズムを使用して、より堅牢に編集を処理できます。
http://cmp.felk.cvut.cz/~chum/papers/chum_bmvc08.pdf
最後に、スタンフォードには、この種のアプローチのよりエキゾチックな変形に基づく画像検索があり、ウェーブレットからより多くの特徴抽出を行って画像の回転またはスケーリングされたセクションなどを見つけますが、それはおそらくあなたの作業量をはるかに超えていますやりたい.
http://wang14.ist.psu.edu/cgi-bin/zwang/regionsearch_show.cgi
Fast Multiresolution Image Querying という非常に信頼できるアルゴリズムを実装しました。そのための私の(古代の、メンテナンスされていない)コードは here です。
高速多重解像度画像クエリは、YIQ色空間に基づいて画像を3つの部分に分割します(RGBよりもマッチングの方が優れています)。次に、各色空間から最も顕著な特徴のみが利用可能になるまで、画像は基本的にウェーブレットアルゴリズムを使用して圧縮されます。これらのポイントはデータ構造に保存されます。クエリ画像は同じプロセスを経て、クエリ画像の顕著な特徴が保存されたデータベースの特徴と照合されます。一致が多いほど、画像が類似している可能性が高くなります。
このアルゴリズムは、「スケッチによるクエリ」機能によく使用されます。私のソフトウェアでは、URLを介したクエリ画像の入力のみが許可されていたため、ユーザーインターフェイスはありませんでした。ただし、サムネイルをその画像の大きなバージョンに一致させるのに非常にうまく機能していることがわかりました。
私のソフトウェアよりもはるかに印象的なのは retrievr です。これにより、Flickrイメージをソースとして使用してFMIQアルゴリズムを試すことができます。とてもかっこいい!スケッチまたはソース画像を使用して試してみると、どのように機能するかを確認できます。
画像には多くの特徴があるため、平均的な明るさのように1つに絞り込まない限り、n次元の問題空間を扱っています。
世界の都市に単一の整数を割り当てるように頼んだら、どの都市が近いかわかりますが、結果は良くありません。たとえば、単一の整数としてタイムゾーンを選択し、特定の都市で良い結果を得ることができます。ただし、北極の近くの都市と南極の近くの別の都市は、惑星の両端にある場合でも同じタイムゾーンにある可能性があります。 2つの整数を使用すると、緯度と経度で非常に良い結果を得ることができます。問題は画像の類似性でも同じです。
そうは言っても、同様の画像を一緒にクラスター化しようとするアルゴリズムがありますが、これはあなたが求めているものです。これは、Picasaで顔検出を行うと発生します。顔を特定する前であっても、類似した顔をまとめて、類似した顔のセットを簡単に調べて、ほとんどの人に同じ名前を付けることができます。
また、Principle Component Analysisと呼ばれる手法もあります。これにより、n次元のデータをより少ない次元に減らすことができます。したがって、n個の特徴を持つ画像は1つの特徴に縮小できます。ただし、これはまだ画像を比較するための最良のアプローチではありません。
Cライブラリ( "libphash"- http://phash.org/ )があり、画像の「知覚的ハッシュ」を計算し、ハッシュを比較することで同様の画像を検出できます(つまり(各画像を他のすべての画像と直接比較する必要はありません)が、残念ながら、試したときはあまり正確ではないようでした。
何が「似ている」かを決める必要があります。コントラスト?色相?
写真は、同じ写真と上下逆になっていますか?
画像を4x4のピースに分割し、各グリッドセルの平均色を取得することで、多くの「近い呼び出し」を見つけることができると思います。画像ごとに16のスコアがあります。類似性を判断するには、画像間の差の平方の合計を行うだけです。
色相、明るさ、コントラストなどの単一の概念に反しない限り、単一のハッシュが意味をなさないと思います。
あなたのアイデアは次のとおりです。
0299393
0599483
0499994 <- possible dupe
0499999 <- possible dupe
1002039
4995994
6004994
まず、これらがR *(2 ^ 16)+ G *(2 ^ 8)+ Bなどの10進数であると仮定します。赤は過度に重み付けされるため、明らかにそれは良くありません。
HSV空間に移動する の方が良いでしょう。 HSVのビットを広げる をハッシュに入れるか、HまたはSまたはVを個別に解決するか、画像ごとに3つのハッシュを作成することができます。
もう一つ。 R、G、Bの重みを付けると、人間の視覚感度に合わせて、緑、赤、青の順に重みが高くなります。
Webサービスの時代には、 http://tineye.com を試すことができました
質問類似の画像を識別する良い方法?はあなたの質問に対する解決策を提供しているようです。
私は、他の複製画像検索ソフトウェアが画像に対してFFTを実行し、異なる周波数の値をベクトルとして保存すると仮定しました:
Image1 = (u1, u2, u3, ..., un)
Image2 = (v1, v2, v3, ..., vn)
そして、2つの画像の重みベクトル間の距離を計算することにより、2つの画像のequalnessを比較できます:
distance = Sqrt(
(u1-v1)^2 +
(u2-v2)^2 +
(u2-v3)^2 +
...
(un-vn)^2);
近重画像検出を検出するための最新のアプローチでは、興味深い点の検出と、そのような点の周囲の領域を記述する記述子を使用します。多くの場合、 [〜#〜] sift [〜#〜] が使用されます。次に、記述子を定量化し、クラスターを視覚的なWordの語彙として使用できます。
したがって、2つの画像の共通の視覚的な単語とこれらの画像のすべての視覚的な単語の比率を見ると、画像間の類似性を推定できます。興味深い記事がたくさんあります。それらの1つは 重複画像の検出に近い:minHashとtf-idfの重み付け です。
たとえば、IMMI拡張とIMMIを使用すると、画像間の類似性を測定するさまざまな方法を調べることができます。 http://spl.utko.feec.vutbr.cz/en/component/content/article/46-image- processing-extension-for-rapidminer-5
しきい値を定義し、方法を選択することにより、類似性を測定できます。
1つの解決策は、バブルソートの実行に必要なすべての写真のペアで RMS/RSS 比較を実行することです。次に、各画像で [〜#〜] fft [〜#〜] を実行し、軸の平均化を行って、並べ替えのインデックスとして使用する各画像の単一の整数を取得します。 。無視する差をどれだけ小さくするか、必要な高速化の程度に応じて、元のサイズ変更(25%、10%)バージョンで比較を検討することもできます。これらのソリューションが興味深いかどうかを教えてください。議論するか、サンプルコードを提供できます。