感知哈希算法 (Perceptual Hash) 為每張圖片生成一個「指紋」字符串,通過比較指紋相似度判斷圖片內容相似度。不同於加密哈希(MD5/SHA),pHash 對縮放、壓縮、輕微噪聲具備魯棒性。
mean。1,< mean 記 0,得到 64-bit 指紋。1 的個數。
| 優點 | 缺點 |
|---|---|
| 極快(僅需 DCT/縮放 + 平均) | 對旋轉、鏡像、大幅裁剪、內容替換敏感 |
| 不受圖片尺寸/比例影響 | 無法檢測語義級相似(如同一物體不同角度) |
| 實現簡單,無需訓練 | 64-bit 指紋衝突概率隨庫增大而升高 |
DCT 版本對 JPEG 壓縮、輕微旋轉、亮度調整魯棒性顯著優於均值版。
pip install phash / imagehash。com.github.axet:phash。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) 精排,兼顧速度與準確率。