5

David Oftedalによって実装されたNeal Krawetz 博士の方法を使用して PHASH を計算した画像のデータベースがあります。

これらの long の差を計算するサンプル コードの一部は次のとおりです。

ulong hash1 = AverageHash(theImage);
ulong hash2 = AverageHash(theOtherImage);

uint BitCount(ulong theNumber)
{
    uint count = 0;
    for (; theNumber > 0; theNumber >>= 8) {
        count += bitCounts[(theNumber & 0xFF)];
    }
    return count;
}

Console.WriteLine("Similarity: " + ((64 - BitCount(hash1 ^ hash2)) * 100.0) / 64.0 + "%");

課題は、これらのハッシュの 1 つしか知らないため、SOLR にクエリを実行して類似性の順に他のハッシュを見つけたいということです。

いくつかのメモ:

  1. ここでSOLRを使用します(私が持っている唯一の代替手段はHBASEです)
  2. カスタム Java を solr にインストールすることを避けたい (既存のプラグインをインストールしてよかった)
  3. C# で多くの前処理を実行できることを嬉しく思います
  4. 複数のフィールドを使用して、データをビット文字列や long などとして保存できます。
  5. SOLRNet をクライアントとして使用する

編集、いくつかの追加情報(問題に巻き込まれ、広く知られている領域であると想定し始めたことをお詫びします)。C# コンソール/サンプル アプリへの直接ダウンロードは次のとおりです: http://01101001.net/Imghash.zip

このコンソール アプリの出力例は次のようになります。

004143737f7f7f7f phash-test-001.jpg
0041417f7f7f7f7f phash-test-002.jpg
類似度: 95.3125%

4

1 に答える 1

4

これにはSolr のあいまい検索を使用できます。ページを少し下にスクロールする必要があります。

Solr の標準クエリ パーサーは、Levenshtein Distance または Edit Distance アルゴリズムに基づくファジー検索をサポートしています。あいまい検索は、必ずしも完全に一致するわけではなく、指定された用語に類似する用語を検出します。あいまい検索を実行するには、単語の末尾にチルダ ~ 記号を使用します。

以下のようなスキーマがあると仮定すると、このフィールドphashには計算した phash が保持されます。

<fields>
    <!-- ... all your other fields ... -->
    <field name="phash" type="string" indexed="true" stored="true" />
</fields>

次のようなクエリを実行できます

q=phash:004143737f7f7f7f~0.8&
fl=score,phash

Levenshtein Distance or Edit Distanceこれにより、少なくとも 80% のPHASH を持つすべてのドキュメントが返されます。質問で指定した 95.3125% は得られませんが、一致する/一致しない文字がカウントされるため、87,5% は得られます。

その値を確認したい場合は、次のクエリを実行できます

q=phash:004143737f7f7f7f~0.8&
fl=score,phash,strdist("0041417f7f7f7f7f", phash, edit)

これは、Levenstein または Edit 距離を使用して String Distance を取得するための関数呼び出しであり、次のような結果が得られます。

+----------------+---------------------------------------+
|hash            |strdist("0041417f7f7f7f7f", hash, edit)|
+----------------+---------------------------------------+
|0041417f7f7f7f7f|1.0                                    |
+----------------+---------------------------------------+
|004143737f7f7f7f|0.875                                  |
+----------------+---------------------------------------+

と の間のギャップを減らしたい場合は、PHASH を 16 進数値ではなく、たとえば 8 進数値として格納することを検討する必要が95.3125%あります。87,5%

于 2014-02-14T16:02:59.320 に答える