知覚ハッシュ - 画像類似性分析

‍この記事の著者は 360 Qiwu Troupe の開発エンジニアです

導入

テーマカラーの異なるミニプログラムが異なる画像ライブラリに対応していて、プロジェクト内の画像を参照する方法がオンラインのURLアドレス設定フォームであるため、最近はミニプログラムのスキニング機能に取り組んでいます。写真のセット、写真とオンライン URL リンクを比較した後、対応するキーに設定します。このような手作業を行った結果、時間と労力がかかることが判明しました。異なる画像ライブラリ間では主に色の違いがあるため、画像の類似性を比較した後、画像を対応するキーに自動的に一致させることは可能でしょうか。最後に、調査の結果、私のニーズが知覚的ハッシュ化によって実現されたので、それを記録します。

知覚的ハッシュ

コンセプト

知覚ハッシュとは、フィンガープリント アルゴリズムを使用して、さまざまな形式のマルチメディアのフラグメント、ハッシュ、またはフィンガープリントを生成することです。知覚的ハッシュは、局所性依存型ハッシュの一種であり、マルチメディアの特性が似ていれば類似します
イメージング アプリケーションにおいて、知覚的イメージ ハッシュは、イメージの視覚的な外観に基づいてイメージ フィンガープリントを作成する方法ですこのフィンガープリントにより、類似した画像を比較しやすくなります。このアルゴリズムは画像検索シナリオでよく使用され、提供された画像に基づいて視覚的に類似した画像を返します。たとえば、Google の画像検索は知覚ハッシュに基づいています。

知覚的ハッシュと暗号的ハッシュ

知覚ハッシュは、 MD5 や SHA1 などの暗号化ハッシュ関数とは異なる概念です暗号化ハッシュ
では、ハッシュ値はランダムです。ハッシュの生成に使用されるデータはランダム シードのようなものであるため、同じデータからは同じ結果が生成されますが、異なるデータからは大きく異なる結果が生成されます対照的に、知覚的ハッシュは比較して、2 つのデータセット間の類似性を取得できます2 つの SHA1 ハッシュを比較すると、実際には 2 つの結論しか得られません。ハッシュが異なる場合、データは異なります。ハッシュが同じであれば、データはおそらく同じです。(ハッシュが衝突する可能性があるため、同じハッシュであっても同じデータが保証されるわけではありません)。この機能に基づいて、MD5SHA1 を使用してファイルのハッシュ値を計算し、それを比較して重複ファイルかどうかを判断できます。ただし、画像の類似性のシナリオでは、同じデータを判断するためのこのような厳密な比較アルゴリズムは適していません。なぜなら、画像の場合、画像形式、メタデータ、その他の情報を変更すると、ピクセル コンテンツがまったく同じであっても、異なるバイナリ コンテンツが生成され、結果として完全に異なるハッシュが生成されるからです。さらに、画像の解像度、明るさ、彩度、コントラスト、ぼかし、スケーリング、回転、インターセプト、軽微な変更などの操作によって生じた同様の画像でも、暗号化されたハッシュを使用して比較すると、まったく異なる結果が得られます。したがって、画像の類似性に必要なのは、ファイルのバイナリ コンテンツの単純かつ大まかな比較ではなく、画像上のピクセルの色の分布です知覚的ハッシュ計算の類似性のシナリオでは、画像のカラー ヒストグラムの右端の白レベルと左端の黒レベルの分布として大まかに理解できます。


444106f58672f5f5fadd02836f93ae70.png

ハミング距離

知覚的ハッシュを通じて画像の指紋文字列を生成できます。文字列間の距離 (通常はハミング距離、ハミング距離) を比較することで、距離が小さいほど、2 つの画像はより類似します。一般に、次のルールがあります
: ::tips
ハミング距離 = 0 ->
ハミング距離に特に似ています < 5 -> 非常に似ています
ハミング距離 > 10 -> 別の画像
:::
ハミング距離はデータ伝送誤り制御符号化で使用されます。ハミング距離は概念であり、これを表します2 つの (同じ長さの) 文字列内の対応する位置にある異なる文字の数。2 つの文字列に対して XOR 演算を実行し、1 の数を数えます。この数値がハミング距離になります
情報理論では、同じ長さの 2 つの文字列間のハミング距離は、2 つの文字列の対応する位置にある異なる文字の数です。言い換えれば、これは、ある文字列を別の文字列に変換するために置換する必要がある文字の数です。例:
101100 と 111000 の間のハミング距離は 2 です
21438 と 22337 の間のハミング距離は 3 です。
「toned」と「roses」の間のハミング距離は 3 です。
682978d4993b77ad90cda71a0a7399f4.png

実装プロセス

知覚ハッシュ アルゴリズムは、色分布の計算方法の違いに応じて、 aHash、pHash、dHash などのアルゴリズムの総称です
実装プロセスは次のように単純化できます。画像を単純化する - ピクセル値を取得する - 画像ハッシュを計算する異なるハッシュ アルゴリズムには同じ基本特性があります。拡大または縮小された画像、異なるアスペクト比、小さな色の違い (コントラスト、明るさ、ぼかし、彩度など) の場合でも、平均ハッシュ アルゴリズム ( aHash ) を使用して同様の画像と一致します。このアルゴリズム

、グレースケール イメージの各ピクセルと平均値の比較に基づいています。
91a511cff35c6c2ea640c48734fc8147.png
ベイブリッジの夜景 – 写真提供者: DH Parks (CC)
Python で平均ハッシュを計算するプロセスを以下に示します。最初のステップは、 PILまたはPillow
を使用して画像のサイズと色を減らすことです。これは、画像の複雑さを軽減し、比較をより正確にするために行われます。

image = image.resize((8, 8), Image.ANTIALIAS)  # Reduce it's size.

a32f9e093f65623681044700960b0465.png

image = image.convert("L")  # Convert it to grayscale.

c6236c6eab39556e67171f08f580a633.png
次に、画像の平均ピクセル値を求めます。

pixels = list(image.getdata())
avg = sum(pixels) / len(pixels)

pixels0 (黒) から 255 (白) までの範囲のピクセル値のリストを単純に加算し、その量で割って平均を取得します。この画像の平均ピクセル値は 61 (約 25% グレースケール) です。
これでハッシュ値を計算できるようになりました。これは、画像内の各ピクセルを平均ピクセル値と比較することによって行われます。ピクセル値が平均より小さい場合は 0、平均より大きい場合は 1。次に、それをビットの文字列として扱い、16 進数に変換します。

bits = "".join(map(lambda pixel: '1' if pixel &lt; avg else '0', pixels))  # '00010100...'
hexadecimal = int(bits, 2).__format__('016x').upper()

a4d0a9dad945b68cf1bef4c4809ee93d.png
白黒画像に変換するビット。
これにより、ハッシュ値 00010E3CE08FFFFE が得られます。これを使用して、この画像の「構造」(外観) を、ハミング距離によって同じ方法でハッシュされた他の画像と比較できます。距離が 0 に近づくほど、画像は類似しており、0 は基本的に同じであることを意味します。
知覚ハッシュ アルゴリズム (pHash):
pHash アルゴリズムは知覚ハッシュ アルゴリズムです。原理は、離散コサイン変換 (DCT) によって画像周波数を低減することです。画像周波数では、高周波は細部を表し、低周波は構造を表します。画像の特徴の大部分は非可逆圧縮によって保持され、その後特徴値が比較されます。つまり、高周波は無視され、低周波は保持されます
DCT: DCT の正式名称は Discrete Cosine Transform、つまり離散コサイン変換です。その原理は、ターゲット信号を複素時間領域信号から異なる周波数強度の周波数領域信号に分解するフーリエ変換の原理と似ています。フーリエの原理によれば、複雑な信号は単純な信号の重ね合わせであるため、DCT の基本原理は、異なる強度と周波数の複数の DCT ベース信号を通じて、元の信号を重ね合わせて「組み立て」ることができるため、実際に記録された信号はこのとき、複雑な元の信号を記録する必要はなくなり、DCT の基礎を記録する必要があります。また、信号が DCT 周波数領域信号に変換された後、左上隅は低周波信号強度を表し、右下隅は高周波信号強度を表し、信号の周波数成分と強度が明確になります。元の信号の複雑さはなく、一目でわかります。
DCT 行列では、左上隅から右下隅までの係数は、ますます高周波係数を表しますが、左上隅を除いて、他の部分の係数はすべてほぼ 0 です。 pHash アルゴリズムが画像を単純化すると、多くの場合、画像は 32 32 に縮小されるため、DCT マトリックスの左上隅にある 8 8 の部分のみを選択すると、画像のほとんどの特徴を取得できます。
b08af0dc178b26b6a51b5fd1d199acb7.png
次に、8 8 部分行列の各値と平均値を比較し、その組み合わせも 64 ビット 0/1 ハッシュ シーケンスとなり、最終的に同じビット比較を通じて類似度が得られます。
pHash アルゴリズムの利点は、安定性が高く、判定効果が高いことですが、速度が若干遅いことです。
差分ハッシュ アルゴリズム (dHash):
dHash アルゴリズムは差分ハッシュ アルゴリズムです。原理は、各行の隣接する要素のサイズを比較することです。左側のピクセルが右側のピクセルより明るい場合、そのピクセルは 1 としてマークされます。それ以外の場合は 0 となり、最終的に結合されて Ha ギリシャ語シーケンスが得られます
このアルゴリズムが画像を単純化する場合、多くの場合、画像は 9
8 に縮小され、各ラインの 9 要素の隣接比較により 8 つの値、合計 8 ラインが得られ、結果も 64 ビット 0/1 ハッシュになります。順序。
2 つの画像のハッシュ シーケンスを比較して、類似性を取得することもできます。
dHash アルゴリズムの利点は、高速であり、判定効果が aHash より優れていることです。
上記 3 つのハッシュ アルゴリズムは opencv で実装できますが、インターネット上には多くのコード実装があるため、ここでは掲載しません。パッケージ化されて実装されているサードパーティ ライブラリ imagehash を Python で直接使用することもでき、非常に簡単に使用できます。

要約する

画像の類似性比較にはさまざまなシナリオがありますが、画像の類似性を比較するための知覚ハッシュ アルゴリズムの原理を理解することによってのみ、どのシナリオが適しているかを判断できます。知覚ハッシュは、ほとんどの場合、わずかな色調、ズーム、さらには細部の違いなどのシナリオに対して高い認識率を持つシンプルな方法を提供します。画像の色分布構造に影響を与えるトリミング、回転、局所的な修正 (境界線、透かし) の追加などのシーンでは、認識エラー率が比較的高くなります。
画像の類似性の違いは大きく異なる可能性があり、類似性は相対的な概念であり、人間でも判断を誤る可能性があるため、100% の精度を備えた類似画像アルゴリズムは存在しませんしたがって、実際の使用シナリオに応じて、互換性のために他の補助識別アルゴリズムを使用する限り、ニーズを満たすことができます。

参考リンク

https://www.hackerfactor.com/blog/index.php?/archives/432-Looks-Like-It.html
https://web.archive.org/web/20171112054354/https://www.safaribooksonline。 com/blog/2013/11/26/image-hashing-with-python/
https://blog.csdn.net/cjzjolly/article/details/123524616
https://zhuanlan.zhihu.com/p/68215900
https: //www.yumefx.com/?p=3163

- 終わり -

Qi Wu 劇団について

Qi Wu Troupe は 360 グループ最大のフロントエンド チームであり、グループを代表して W3C および ECMA メンバー (TC39) の活動に参加しています。Qi Wu Troupe は人材育成を非常に重視しており、エンジニア、講師、翻訳者、ビジネス インターフェース担当者、チーム リーダー、その他の開発方向性を従業員が選択できるほか、技術スキル、専門スキル、一般スキル、リーダーシップスキルなどのコース。Qi Dance Troupe は、あらゆる種類の優れた才能に注目し、オープンで才能を求める姿勢で Qi Dance Troupe に参加することを歓迎します。

e36ccea673d94f55035a7fe0cdb0d4ae.png

おすすめ

転載: blog.csdn.net/qiwoo_weekly/article/details/132703140