zoukankan      html  css  js  c++  java
  • 感知哈希算法

    有一些搜索引擎有搜索相似图片的功能,比如Google,其中是什么原理呢?

    其实我们利用一个算法就能达到相似的效果,其中涉及到的算法就是【感知哈希算法(Perceptual hash algorithm)】,下面就简单介绍下该算法。

    感知哈希算法的原理就是给每张图片生成一个“指纹”,指纹越相似的两张图片它们的相似度就越高,那么我们如何给图片生成指纹呢?具体的步骤如下:

    1.缩小图片的尺寸

    将图片缩小到8*8的尺寸,总共64个像素,这样做的目的是去除图片尺寸,比例带来的差异,最快速的去除高频和细节差异,仅保留图片的基本结构。

    2.简化色彩

    将上面缩小后的图片转化为64级灰度,也就是说图片中的像素点最多只有64中颜色

    3.计算平均值

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

    4.比较像素的灰度

    将64个灰度分别与平均值作比较,如果灰度值大于等于平均值则记为1,反之记为0

    5.生成哈希值

    将上一步中的结果组合在一起,就构成了一个64位的数,值得说明的是64位数中的顺序并没有严格的要求只要两张图片所采用的顺序一致即可,例如自左到右、自顶向下、big-endian。得到指纹以后,就可以对比不同的图片,比较64位中有多少位是不同的。在理论上,这等同于计算“汉明距离”(Hamming distance)。如果不相同的数据位不超过5,就说明两张图片很相似;如果大于10,就说明这是两张不同的图片。

    算法优点:简单快速,不受图片大小缩放的影响,它的最佳用途是根据缩略图,找出原图。

    算法缺点:图片的内容不能变更。如果在图片上加几个文字,汉明距离就会很大导致辨认出错,但是实际上这两张图片还是出自同一张原片。

    实际应用中,往往采用更强大的pHash算法和SIFT算法,它们能够识别图片的变形。只要变形程度不超过25%,它们就能匹配原图。这些算法虽然更复杂,但是原理与上面的简便算法是一样的,就是先将图片转化成Hash字符串,然后再进行比较。

  • 相关阅读:
    RabbitMQ介绍
    idea根据Ctrl和滑轮改变字体大小
    com.fasterxml.jackson.databind.exc.InvalidDefinitionException
    Git出现Push rejected: Push to origin/master was rejected
    java单机操作redis3.2.10和集群操作增删改查
    java操作hbase1.3.1的增删改查
    Gobblin采集kafka数据
    使用连接池和缓存机制,处理连接数据库操作
    用cmd导入oracle的.dmp文件和修改oracle管理员密码
    oracle to_date函数和mysql DATE_FORMAT函数用法
  • 原文地址:https://www.cnblogs.com/xiaoysec/p/4359813.html
Copyright © 2011-2022 走看看