返回首页

感知哈希:搜索相似图像

本文介绍了感知图像哈希的原理。考虑了两种主要方法——平均哈希和基于离散余弦变换的 pHash。提供了性能和对修改鲁棒性的比较。

如何找到相似图片:面向开发者的感知哈希
Advertisement 728x90

感知哈希:算法如何识别相似图像

感知哈希可以检测图像之间的视觉相似度,即使它们在尺寸、颜色或压缩程度上有所不同。与 SHA1 等加密哈希不同,感知哈希保留了图像结构的特征信息,并且对细微修改具有鲁棒性。这使得它们在重复图像检测、内容识别和数字取证系统中不可或缺。

感知哈希基础

加密哈希函数旨在验证数据完全匹配:输入文件哪怕最细微的变化也会导致哈希值完全不同。感知哈希解决的是另一个问题——对于图像视觉上不明显的改变,它们的哈希值保持相似。这种方法基于人类视觉忽略细微细节、关注整体结构的事实。

感知哈希算法通常具有以下特点:

Google AdInline article slot
  • 对尺寸和宽高比变化具有鲁棒性;
  • 对亮度和对比度调整不变;
  • 在轻微压缩或噪声下保持相似性;
  • 计算速度快且可扩展。

要比较两张图像,先计算它们的哈希值,然后测量汉明距离——即不同比特位的数量。距离越小,视觉相似度越高。

最简单的方法:平均哈希

最易实现的一种感知哈希算法基于像素平均值。其步骤如下:

  • 调整大小到 8×8 像素——这大大降低了高频细节的影响。
  • 转换为灰度图——消除对颜色通道的依赖。
  • 计算所有 64 个像素的平均亮度
  • 二值化:亮度高于平均值的像素设为 1,低于平均值的设为 0。
  • 拼接比特位形成 64 位哈希(通常从左到右、从上到下)。

这种方法速度极快,对精确或近似重复图像非常有效。但它对非线性变换(如 gamma 校正或直方图调整)敏感,因为平均值会偏移,导致许多比特位翻转。

Google AdInline article slot

改进方法:基于 DCT 的 pHash

pHash(感知哈希)算法使用离散余弦变换(DCT)来聚焦图像的低频分量——这些分量定义了整体结构。pHash 的步骤如下:

  • 调整大小到 32×32 像素——足以正确应用 DCT。
  • 转换为灰度图
  • 对整个图像应用 DCT(不同于 JPEG 中对 8×8 块应用 DCT)。
  • 从结果频率矩阵中提取左上角 8×8 块——它包含最低频率。
  • 计算这 64 个系数的平均值,排除第一个(DC 分量),以避免对整体亮度的依赖。
  • 将系数相对于该平均值二值化
  • 形成 64 位哈希

这种方法对颜色和亮度失真具有显著更高的鲁棒性。即使经过 gamma 校正或局部变化(如在图像小部分添加水印),哈希值仍与原图非常接近。

实际应用与局限性

在像 TinEye 或内部数字取证工具这样的实际系统中,通常会结合多种方法:

Google AdInline article slot
  • 为整个档案预计算哈希;
  • 使用快速平均哈希进行初步过滤;
  • 使用 pHash 或其他高级算法进行精炼;
  • 附加特征:颜色分布、物体位置、面部存在等。

例如,在人脸识别系统中,可以仅针对面部区域单独计算哈希,从而提升肖像合集的准确性。

然而,没有任何感知哈希能保证 100% 准确性。重大变化——如更换背景、大角度旋转或交换关键物体——可能使图像视觉上不同,但哈希值仍可能接近,反之亦然。

关键要点

  • 感知哈希度量的是视觉相似性,而非比特级相似性。
  • 哈希间的汉明距离是评估相似性的主要方法。
  • 平均哈希速度快,但对非线性变换脆弱。
  • 基于 DCT 的 pHash 对修改具有更好的鲁棒性。
  • 工业系统使用方法组合和预索引。

方法比较

| 指标 | 平均哈希 | pHash (DCT) |

|------------------------|--------------|----------------|

| 速度 | 非常高 | 中等 |

| 噪声鲁棒性 | 中等 | 高 |

| Gamma 鲁棒性 | 低 | 高 |

| 内存需求 | 最小 | 中等 |

| 适用于批量搜索 | 是 | 是(需索引) |

方法选择取决于任务:精确副本用平均哈希,修改图像用 pHash。

— Editorial Team

Advertisement 728x90

继续阅读