感知哈希:算法如何识别相似图像
感知哈希可以检测图像之间的视觉相似度,即使它们在尺寸、颜色或压缩程度上有所不同。与 SHA1 等加密哈希不同,感知哈希保留了图像结构的特征信息,并且对细微修改具有鲁棒性。这使得它们在重复图像检测、内容识别和数字取证系统中不可或缺。
感知哈希基础
加密哈希函数旨在验证数据完全匹配:输入文件哪怕最细微的变化也会导致哈希值完全不同。感知哈希解决的是另一个问题——对于图像视觉上不明显的改变,它们的哈希值保持相似。这种方法基于人类视觉忽略细微细节、关注整体结构的事实。
感知哈希算法通常具有以下特点:
- 对尺寸和宽高比变化具有鲁棒性;
- 对亮度和对比度调整不变;
- 在轻微压缩或噪声下保持相似性;
- 计算速度快且可扩展。
要比较两张图像,先计算它们的哈希值,然后测量汉明距离——即不同比特位的数量。距离越小,视觉相似度越高。
最简单的方法:平均哈希
最易实现的一种感知哈希算法基于像素平均值。其步骤如下:
- 调整大小到 8×8 像素——这大大降低了高频细节的影响。
- 转换为灰度图——消除对颜色通道的依赖。
- 计算所有 64 个像素的平均亮度。
- 二值化:亮度高于平均值的像素设为 1,低于平均值的设为 0。
- 拼接比特位形成 64 位哈希(通常从左到右、从上到下)。
这种方法速度极快,对精确或近似重复图像非常有效。但它对非线性变换(如 gamma 校正或直方图调整)敏感,因为平均值会偏移,导致许多比特位翻转。
改进方法:基于 DCT 的 pHash
pHash(感知哈希)算法使用离散余弦变换(DCT)来聚焦图像的低频分量——这些分量定义了整体结构。pHash 的步骤如下:
- 调整大小到 32×32 像素——足以正确应用 DCT。
- 转换为灰度图。
- 对整个图像应用 DCT(不同于 JPEG 中对 8×8 块应用 DCT)。
- 从结果频率矩阵中提取左上角 8×8 块——它包含最低频率。
- 计算这 64 个系数的平均值,排除第一个(DC 分量),以避免对整体亮度的依赖。
- 将系数相对于该平均值二值化。
- 形成 64 位哈希。
这种方法对颜色和亮度失真具有显著更高的鲁棒性。即使经过 gamma 校正或局部变化(如在图像小部分添加水印),哈希值仍与原图非常接近。
实际应用与局限性
在像 TinEye 或内部数字取证工具这样的实际系统中,通常会结合多种方法:
- 为整个档案预计算哈希;
- 使用快速平均哈希进行初步过滤;
- 使用 pHash 或其他高级算法进行精炼;
- 附加特征:颜色分布、物体位置、面部存在等。
例如,在人脸识别系统中,可以仅针对面部区域单独计算哈希,从而提升肖像合集的准确性。
然而,没有任何感知哈希能保证 100% 准确性。重大变化——如更换背景、大角度旋转或交换关键物体——可能使图像视觉上不同,但哈希值仍可能接近,反之亦然。
关键要点
- 感知哈希度量的是视觉相似性,而非比特级相似性。
- 哈希间的汉明距离是评估相似性的主要方法。
- 平均哈希速度快,但对非线性变换脆弱。
- 基于 DCT 的 pHash 对修改具有更好的鲁棒性。
- 工业系统使用方法组合和预索引。
方法比较
| 指标 | 平均哈希 | pHash (DCT) |
|------------------------|--------------|----------------|
| 速度 | 非常高 | 中等 |
| 噪声鲁棒性 | 中等 | 高 |
| Gamma 鲁棒性 | 低 | 高 |
| 内存需求 | 最小 | 中等 |
| 适用于批量搜索 | 是 | 是(需索引) |
方法选择取决于任务:精确副本用平均哈希,修改图像用 pHash。
— Editorial Team
暂无评论。