最近由于要租房,所以下载了58同城的APP,在找个人房源过程中发现,58同城会把图片相似的发帖纪录被标志出来,并警告用户此信息可能是假的。这里不讨论58同城的这方面做得人性化。而是就图片相似度算法来做一下分析。

    百度和谷歌都推出了“以图搜图”的功能,至今都没用过,也是挺无语的……

    最近翻阅了这方面的资料,属“感知哈希算法”最为成熟,“感知哈希算法”的作用是对每张图片生成一个指纹字符串,然后比较不同图片的指纹。结果越接近,说明图片越相似。下面就简单介绍一下此算法

  • 缩小图片尺寸

    将图片缩小到8*8的尺寸,总共64个像素。这一步的作用是去除图片的细节,只保留结构、明暗等基本信息,摒弃不同尺寸、比例带来的图片差异。

    用汉明距离进行图片相似度检测的Java实现 用汉明距离进行图片相似度检测的Java实现

  • 简化色彩

    将缩小后的图片,转为64级灰度。也就是说,所有像素点总共只有64中颜色

  • 计算平均值

    计算所有64个像素的灰度平均值

  • 比较像素灰度

    将每个像素的灰度,与平局值进行比较。大于或等于平局值,记为1;小于平均值记为0

  • 计算哈希值

    将上一步比较结果,组合在一起,就构成了一个64位的整数,这就是这张图片的指纹。组合的次序并不重要,只要保证所有图片都采用同样的次序就好了。

    用汉明距离进行图片相似度检测的Java实现 = 用汉明距离进行图片相似度检测的Java实现 = 8f373714acfcf4d0

得到指纹以后,就可以对比不同的图片,看看64位中有多少是不一样的。在理论上,这等同于计算汉明距离。如果不相同的数据位超过5位,就说明两张图片很相似;如果结果大于10,就说明这是不同的图片。

具体详情请查看博客:图片相似度算法