使用hash 计算图像的相似度,是在图像预处理中去除重复的图像。

图像相似度的计算有很多方法。哈希是一种传统的方式,相比于深度学习的方法。该算法可以用以计算图像之间的相似性。

图片hash是检测一张图片的内容然后根据检测的内容为图片建立一个唯一值的过程。为什么不使用md5,sha-1等算法?不幸的是,我们不能在实现中使用加密hash算法。由于加密hash算法的本质使然,输入文件中非常微小的差别也能造成差异极大的hash值。而在图片指纹的案例中,我们实际上希望相似的输入可以有相似的hash输出值。

简单来说,DHash算法着眼于两个相邻像素之间的差值。然后,基于这样的差值,就建立起一个hash值了。

应用场景

相似图片的搜索功能。促使了一个三阶段算法的实现:

  1. 为不雅图片建立指纹,然后将图片指纹存储在一个数据库中。

  2. 当一个用户上传一份新的头像时,我们会将它与数据库中的图片指纹对比。如果上传图片的指纹与数据库任意一个不雅图片指纹相符,我们就阻止用户将该图片设置为个人头像。

  3. 当图片监管人标记新的色情图片时,这些图片也被赋予指纹并存入我们的数据库,建立一个能用于阻止非法上传且不断进化的数据库。

average hash(均值散列),简称aHash

平均哈希算法(aHash)此算法通过将图像转为灰度,比较灰度图每个像素与平均值来实现的。

感知哈希算法(pHash)

perception hashing

感知哈希算法(pHash)平均哈希算法过于严格、不够精确,为了获得更精确的结果可以选择感知哈希算法,它采用的是DCT(离散余弦变换)来降低频率的方法。

主函数:def phash(image, hash_size=8, highfreq_factor=4):

两个参数,一起决定了图片resize的大小,最适合的才最好,按照公式:

  • img_size = hash_size * highfreq_factor
  • hash_size代表最终返回hash数值长度
  • highfreq_factor,代表resize的尺度

差异哈希算法(dHash)

difference hashing

梯度散列,计算每个像素的差值,并与平均差异的差异进行比较。

dHash的速度比pHash要快的多,同情况效率比aHash要好,它是基于渐变实现的。

wavelet hashing

离散小波变换(DWT)是频表示的另一种形式。

优缺点

Python imagehash中的均值哈希、感知哈希、梯度哈希、小波哈希对比图片相似度

上述博客给出的一些简单的结论,可以作为参考,不一定是正确的。

pHash测试效果: 结果是对分辨率不敏感,但是对图像的内容很敏感。

wHash测试效果: 对分辨率不是很敏感,对显示内容更敏感。

aHash测试效果: 对分辨率不是很敏感,对显示内容更敏感。

dHash测试效果: 对分辨率不是很敏感,对显示内容更敏感。

pHash相对aHash鲁棒性更好,但速度会略慢。从上述例子也可以看出,用不同的方法最后的相似度数值不同,因此在实际应用中还需结合实际效果不断调整确定阈值。

结论

如果想要使用的话,强烈建议先阅读官方文档 ImageHash 4.1.0