# 图片相似算法
- 根据 MD5 等加密哈希算法可以判断两张图片是否为同一文件,但不能判断两张图片的相似度。因此应该使用专门的图片相似算法。
- 使用图片相似算法的一般步骤:
- 缩小图片的分辨率、减少颜色通道数,以便简化分析。
- 按某种算法计算出每张图片的特征值,再根据两个特征值的汉明距离判断图片的相似度。
- 相似度 = 1 - ( 汉明距离 / 特征值长度 )
- 汉明距离(Hamming Distance):两个长度相同的字符串之间,取值不同的对应位的数量,类似于异或运算。
- 衡量图片相似算法的指标:
- 能否识别内容相似、只是有细节差异的图片。
- 能否识别内容相似、但分辨率不同的图片。
- 能否识别内容相似、只是颜色不同的图片。
- 判断相似度的准确性。
- 处理图片的耗时。
# 内容特征法
- 原理:
- 在色阶 0~255 中选择一个阙值,将图片从灰度图转换成黑白图。比如如果像素点的灰度值低于 150 则转换成黑色,否则转换成白色。
- 如果两张图片的黑白轮廓相似,则认为它们的内容也相似。
# 颜色分布法
- 原理:
- 生成图片的颜色分布的直方图(color histogram)。比如 RGB 三色分别生成直方图,再合并成一个直方图。
- 如果两张图片的直方图相似,则认为它们的内容也相似。
# aHash
:平均哈希算法(average Hash)
- 原理:
- 将图片缩小到 8×8 分辨率。(这样就只需考虑 64 个像素点)
- 将图片转换成灰度图。(这样就只需考虑一个颜色通道)
- 计算 64 个像素点的灰度平均值。
- 将每个像素点的灰度值与平均值作比较,如果大于或等于平均值则计 1 ,否则计 0 。最后得到一个 64 位的哈希值。
- 特点:
- 不考虑图片细节的差异,适合计算缩略图的哈希值。
- 不能适应图片分辨率的变化。将同一张图片放大、缩小,aHash 值会变化很大。
# dHash
:梯度哈希算法(difference Hash)
- 原理:
- 将图片缩小到 9×8 辨率。
- 转换成灰度图。
- 比较每对相邻像素点的灰度值,如果前一个像素点的灰度值大于等于后一个像素点则记 1 。否则计 0 。最后得到一个 64 位的哈希值。
- 比如[254, 254, 255, 253]的计算结果为[1, 0, 1]。
# pHash
:感知哈希算法(perception Hash)
- 基于离散余弦变换(DCT)。
- 原理:
- 将图片缩小到指定分辨率。
- 转换成灰度图。
- 计算灰度图的 DCT 变换,得到一个 32×32 的 DCT 矩阵。可以只取矩阵左上角的 8×8 部分,计算其平均值。
- 将每个像素点的灰度值与平均值作比较,如果大于或等于平均值则计 1 ,否则计 0 。最后得到一个 64 位的哈希值。
- 特点:
- 能考虑到图片细节的差异。
- 计算比较慢。
- 还能计算音频,视频文件的哈希值。
# wHash
:小波哈希算法(wavelet Hash)
- 基于离散小波变换(DWT)。
# SIFT
:尺度不变特征转换算法(Scale-Invariant Feature Transform)
- 特点:
- 能适应图片分辨率的变化。
- 能适应图片的旋转。