图片相似度识别之感知哈希
感知哈希(Perceptual Hash,简称 pHash)是一种用于图像(或视频、音频)相似度比较的哈希算法。与传统加密哈希(如 MD5、SHA)不同,它不追求“完全相同才一致”,而是追求“视觉(或听觉)上越相似,哈希值越接近”。
核心特点
- 抗小扰动:轻微的裁剪、压缩、颜色调整、缩放等操作不会大幅改变哈希值。
- 固定长度输出:通常是 64 bit(8 字节)或 256 bit 的二进制串。
- 相似度可量化:通过计算两个哈希值的汉明距离(Hamming Distance,不同 bit 数)来判断相似程度,距离越小越相似。
经典图像感知哈希(pHash)计算步骤简述
- 将图片缩放到 32×32(或 8×8)小图,去除尺寸影响。
- 转为灰度图,简化颜色信息。
- 可选:应用离散余弦变换(DCT),提取低频分量(人类视觉对低频更敏感)。
- 取 DCT 后的左上角 8×8 区域(低频区),计算这 64 个值的平均值。
- 将每个值与平均值比较,大于平均值为 1,小于等于为 0,得到 64 bit 哈希。
- 比较两张图时,计算这两个 64 bit 串的汉明距离:
- 距离 ≤ 5:几乎肯定是同一张图或极轻微修改
- 距离 ≤ 10:高度相似
- 距离 ≤ 15~20:明显相似但有修改
- 距离 > 30:基本不相似
常见变种
- aHash(平均哈希):更简单,直接用 8×8 缩略图的灰度平均值生成 64 bit。
- dHash(差异哈希):基于相邻像素差值,対渐变更敏感。
- wHash(小波哈希):使用小波变换,精度更高。
汉明距离(Hamming Distance)是两个等长二进制字符串(或比特序列)之间对应位置上不同比特的数量,也称为比特错误数。
正式定义
对于两个长度均为 n 的二进制串 A 和 B,汉明距离 d(A, B) 定义为: d(A, B) = 不同位的个数 数学上等于 A 与 B 按位异或(XOR)运算后结果中 1 的个数。
简单示例
text
A: 1011 0101
B: 1101 1100
按位异或:0110 1001
结果中有 4 个 1
∴ 汉明距离 = 4
常见长度下的直观意义(感知哈希场景)
在 64 bit 感知哈希(pHash、aHash、dHash)中:
| 汉明距离 | 含义(图像相似度) |
|---|---|
| 0 | 完全相同(或极接近) |
| 1–5 | 几乎一样(轻微压缩、格式转换) |
| 6–10 | 高度相似(小改动、水印、轻微裁剪) |
| 11–20 | 明显相似(调色、文字叠加、部分裁剪) |
| 21–30 | 有一定相似,但已有明显差异 |
| >30 | 基本不相似 |
计算方法(编程中常用)
- Python:bin(a ^ b).count('1')
- JavaScript:(a ^ b).toString(2).split('1').length - 1
- 或使用内置函数:Python 的 int.bit_count()(3.10+)
发表回复