# 图片相似算法

  • 根据 MD5 等加密哈希算法可以判断两张图片是否为同一文件,但不能判断两张图片的相似度。因此应该使用专门的图片相似算法。
  • 使用图片相似算法的一般步骤:
    1. 缩小图片的分辨率、减少颜色通道数,以便简化分析。
    2. 按某种算法计算出每张图片的特征值,再根据两个特征值的汉明距离判断图片的相似度。
    3. 相似度 = 1 - ( 汉明距离 / 特征值长度 )
  • 汉明距离(Hamming Distance):两个长度相同的字符串之间,取值不同的对应位的数量,类似于异或运算。
  • 衡量图片相似算法的指标:
    • 能否识别内容相似、只是有细节差异的图片。
    • 能否识别内容相似、但分辨率不同的图片。
    • 能否识别内容相似、只是颜色不同的图片。
    • 判断相似度的准确性。
    • 处理图片的耗时。

# 内容特征法

  • 原理:
    1. 在色阶 0~255 中选择一个阙值,将图片从灰度图转换成黑白图。比如如果像素点的灰度值低于 150 则转换成黑色,否则转换成白色。
    2. 如果两张图片的黑白轮廓相似,则认为它们的内容也相似。

# 颜色分布法

  • 原理:
    1. 生成图片的颜色分布的直方图(color histogram)。比如 RGB 三色分别生成直方图,再合并成一个直方图。
    2. 如果两张图片的直方图相似,则认为它们的内容也相似。

# aHash

:平均哈希算法(average Hash)

  • 原理:
    1. 将图片缩小到 8×8 分辨率。(这样就只需考虑 64 个像素点)
    2. 将图片转换成灰度图。(这样就只需考虑一个颜色通道)
    3. 计算 64 个像素点的灰度平均值。
    4. 将每个像素点的灰度值与平均值作比较,如果大于或等于平均值则计 1 ,否则计 0 。最后得到一个 64 位的哈希值。
  • 特点:
    • 不考虑图片细节的差异,适合计算缩略图的哈希值。
    • 不能适应图片分辨率的变化。将同一张图片放大、缩小,aHash 值会变化很大。

# dHash

:梯度哈希算法(difference Hash)

  • 原理:
    1. 将图片缩小到 9×8 辨率。
    2. 转换成灰度图。
    3. 比较每对相邻像素点的灰度值,如果前一个像素点的灰度值大于等于后一个像素点则记 1 。否则计 0 。最后得到一个 64 位的哈希值。
      • 比如[254, 254, 255, 253]的计算结果为[1, 0, 1]。

# pHash

:感知哈希算法(perception Hash)

  • 基于离散余弦变换(DCT)。
  • 原理:
    1. 将图片缩小到指定分辨率。
    2. 转换成灰度图。
    3. 计算灰度图的 DCT 变换,得到一个 32×32 的 DCT 矩阵。可以只取矩阵左上角的 8×8 部分,计算其平均值。
    4. 将每个像素点的灰度值与平均值作比较,如果大于或等于平均值则计 1 ,否则计 0 。最后得到一个 64 位的哈希值。
  • 特点:
    • 能考虑到图片细节的差异。
    • 计算比较慢。
    • 还能计算音频,视频文件的哈希值。

# wHash

:小波哈希算法(wavelet Hash)

  • 基于离散小波变换(DWT)。

# SIFT

:尺度不变特征转换算法(Scale-Invariant Feature Transform)

  • 特点:
    • 能适应图片分辨率的变化。
    • 能适应图片的旋转。