JA EN

画像フィンガープリント技術の仕組み - pHash と dHash による類似画像検出

· 約 9 分で読めます

画像フィンガープリントとは - 知覚的ハッシュの基本概念

画像フィンガープリント (Image Fingerprinting) とは、画像の視覚的な特徴を短い固定長のハッシュ値に変換する技術です。通常の暗号学的ハッシュ (SHA-256 など) は 1 ビットでも入力が変わると完全に異なる値を出力しますが、知覚的ハッシュ (Perceptual Hash) は見た目が似ている画像に対して似たハッシュ値を生成します。

この特性により、以下のようなユースケースに対応できます:

知覚的ハッシュの核心は「人間が同じと感じる画像には同じハッシュを、異なると感じる画像には異なるハッシュを」割り当てることです。リサイズ、軽微な色調補正、JPEG 再圧縮などの変換に対して頑健 (ロバスト) であることが求められます。一般的なハッシュ長は 64 ビットで、2 つのハッシュ間のハミング距離 (異なるビット数) が類似度の指標になります。ハミング距離が 10 以下であれば「類似画像」と判定するのが一般的な閾値です。

aHash (Average Hash) - 最もシンプルな画像ハッシュ

aHash (Average Hash) は最も単純な知覚的ハッシュアルゴリズムで、画像の平均輝度を基準にビット列を生成します。計算が極めて高速で、大量画像の粗いフィルタリングに適しています。

aHash のアルゴリズム:

実装例 (Python):

from PIL import Image; img = Image.open('photo.jpg').resize((8,8)).convert('L'); pixels = list(img.getdata()); avg = sum(pixels)/len(pixels); hash_bits = ''.join('1' if p >= avg else '0' for p in pixels)

aHash の利点は計算速度です。1 枚あたり数マイクロ秒で処理でき、100 万枚規模のデータベースでも実用的な速度で全件スキャンが可能です。しかし欠点として、コントラスト調整やガンマ補正に弱く、明るさの全体的な変化で大きくハッシュが変わってしまいます。また、8x8 への縮小で空間的な構造情報が失われるため、構図が似ているだけの無関係な画像を誤検出 (false positive) しやすい傾向があります。

dHash (Difference Hash) - 勾配ベースの高速ハッシュ

dHash (Difference Hash) は、隣接ピクセル間の輝度差 (勾配) に基づいてハッシュを生成するアルゴリズムです。aHash の弱点であるコントラスト変化への脆弱性を克服し、より頑健な類似判定を実現します。

dHash のアルゴリズム:

dHash が aHash より優れている理由は、絶対的な輝度値ではなく相対的な変化 (勾配) を捉えるためです。画像全体の明るさが変わっても、隣接ピクセル間の大小関係は保たれることが多いため、コントラスト調整やガンマ補正に対して頑健です。

性能比較 (10 万枚のテストセットでの実測値):

dHash は実装の容易さと精度のバランスが良く、「まず試すべき最初のアルゴリズム」として推奨されます。ただし、画像の左右反転や 90 度回転には対応できません。回転耐性が必要な場合は pHash や特徴点ベースの手法を検討してください。

pHash (Perceptual Hash) - DCT ベースの高精度ハッシュ

pHash (Perceptual Hash) は、離散コサイン変換 (DCT) を利用して画像の周波数特性からハッシュを生成する高精度アルゴリズムです。JPEG 圧縮と同じ数学的基盤を使用するため、JPEG 再圧縮に対して極めて頑健です。

pHash のアルゴリズム:

pHash の強み:

一方で計算コストは aHash/dHash の約 10 倍 (1 枚あたり約 50 マイクロ秒) かかります。大規模データベースでは、まず dHash で候補を絞り込み、次に pHash で精密判定する 2 段階アプローチが効果的です。

ハミング距離による類似度判定と閾値の設計

画像フィンガープリントの比較は、2 つのハッシュ値間のハミング距離 (Hamming Distance) で行います。ハミング距離とは、同じ位置にある異なるビットの数です。64 ビットハッシュの場合、ハミング距離は 0 (完全一致) から 64 (完全不一致) の範囲を取ります。

ハミング距離の計算は XOR 演算とポップカウント (1 のビット数を数える) で高速に実行できます:

distance = bin(hash1 ^ hash2).count('1')

閾値の設計指針 (64 ビットハッシュの場合):

実運用での閾値チューニング:

大規模データベース (100 万枚以上) での高速検索には、BK-Tree (Burkhard-Keller Tree) や VP-Tree (Vantage-Point Tree) などのメトリック空間インデックスを使用します。BK-Tree はハミング距離に特化した木構造で、閾値 d 以内のハッシュを O(n^0.6) 程度で検索できます。また、ハッシュを複数のチャンクに分割して転置インデックスを構築する Multi-Index Hashing も、10 億枚規模のデータベースで実用的な検索速度を実現します。

実装パターンと大規模システムでの活用事例

画像フィンガープリントを本番システムに組み込む際の実装パターンと、実際のサービスでの活用事例を紹介します。

推奨アーキテクチャ (重複検出パイプライン):

主要ライブラリとツール:

実サービスでの活用:

注意点として、知覚的ハッシュは万能ではありません。大幅なクロップ (50% 以上)、回転、アスペクト比の変更、テキストオーバーレイの大量追加などには弱く、これらのケースでは SIFT/ORB などの局所特徴量ベースの手法や、CNN (畳み込みニューラルネットワーク) による特徴抽出が必要になります。用途に応じて適切な手法を選択してください。

関連記事

画像の差分比較手法 - ピクセル単位からセマンティック比較まで

画像の差分を検出・可視化する技術を体系的に解説。ピクセル比較、構造的類似度、知覚的差分など多角的なアプローチを紹介します。

画像改ざん検出の技術と限界 - フォレンジック分析の手法と AI 生成画像の見分け方

画像が改ざんされているかを検出するデジタルフォレンジック技術を解説。ELA 分析、メタデータ検証、AI 生成画像の判別手法とその限界を実例とともに紹介します。

画像キャッシュ戦略の完全ガイド - Cache-Control, ETag, CDN の最適設定

Web サイトの画像配信を高速化する Cache-Control、ETag、CDN キャッシュの設定方法を解説。キャッシュ無効化戦略とバージョニングの実装パターンを具体例とともに紹介します。

二値化処理の種類と最適な閾値決定 - 大津法から適応的二値化まで

画像の二値化処理を体系的に解説。固定閾値、大津の方法、適応的二値化の原理と使い分け、文書画像やセンサー画像での実践的な閾値設計を紹介します。

Web 用画像のファイルサイズ最適化戦略 - 品質を保ちながら軽量化する技術

Web パフォーマンスを最大化するための画像ファイルサイズ最適化手法を、フォーマット選択からメタデータ除去まで体系的に解説します。

工業検査における画像処理技術 - 外観検査から寸法計測まで

製造業の品質管理で使われる画像処理技術を体系的に解説。欠陥検出、寸法計測、パターンマッチング、深層学習による異常検知の実践手法を紹介します。

関連用語