首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

感知哈希算法 (pHash) 原理與漢明距離相似度判斷完整指南

     編輯:關於C語言

什麼是 pHash?

感知哈希算法 (Perceptual Hash) 為每張圖片生成一個「指紋」字符串,通過比較指紋相似度判斷圖片內容相似度。不同於加密哈希(MD5/SHA),pHash 對縮放、壓縮、輕微噪聲具備魯棒性。

核心步驟(標準 64-bit pHash)

  1. 縮小尺寸:將圖片縮放至 8×8 = 64 像素,去除細節,保留結構與明暗。
  2. 灰度化:轉為 64 級灰度(每像素 6 bit)。
  3. 計算平均值:求 64 像素灰度均值 mean。
  4. 二值化比較:逐像素比較,≥ mean 記 1,< mean 記 0,得到 64-bit 指紋。
  5. 漢明距離:兩指紋異或後統計 1 的個數。
    • 距離 ≤ 5:極高相似(同源不同壓縮/裁剪)。
    • 距離 6~10:較相似(可能經過編輯)。
    • 距離 > 10:不同圖片。

優缺點速覽

優點缺點
極快(僅需 DCT/縮放 + 平均)對旋轉、鏡像、大幅裁剪、內容替換敏感
不受圖片尺寸/比例影響無法檢測語義級相似(如同一物體不同角度)
實現簡單,無需訓練64-bit 指紋衝突概率隨庫增大而升高

典型應用場景

  • 以圖搜圖(縮略圖找原圖)。
  • 版權圖片檢測、去重。
  • 視頻關鍵幀提取、場景邊界檢測。

進階變體:DCT-based pHash (更魯棒)

  1. 縮放至 32×32 灰度。
  2. 執行 2D DCT(離散餘弦變換)。
  3. 取左上 8×8 低頻係數(DC 分量除外)。
  4. 計算這 64 個係數中位數,二值化得 64-bit 指紋。

DCT 版本對 JPEG 壓縮、輕微旋轉、亮度調整魯棒性顯著優於均值版。

開源庫與移植

  • 官方庫:pHash.org (C/C++,LGPL)。
  • Python 綁定:pip install phash / imagehash。
  • Java:com.github.axet:phash。
  • Go:github.com/corona10/goimagehash。

單圖指紋計算與距離比較伪代碼

// 輸入:灰度圖 8x8 uint8_t img[64]
// 輸出:uint64_t fingerprint
uint64_t phash_64(const uint8_t* img) {
    uint64_t hash = 0;
    double sum = 0;
    for (int i = 0; i < 64; ++i) sum += img[i];
    double mean = sum / 64.0;
    for (int i = 0; i < 64; ++i) {
        if (img[i] >= mean) hash |= (1ULL << i);
    }
    return hash;
}

// 漢明距離
int hamming_distance(uint64_t a, uint64_t b) {
    return __builtin_popcountll(a ^ b); // GCC/Clang 內建
}

總結

pHash 以極低計算成本換取可接受的感知相似度判斷,是海量圖片去重、以圖搜圖系統的首選第一道篩選器。工程落地建議:pHash 粗篩 + 深度學習特徵 (ResNet/ViT) 精排,兼顧速度與準確率。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved