哈希+汉明距离进行相似性度量_二楼后座Scarlett的博客-程序员ITS301_哈希距离

技术标签: 算法  python  图像检索  计算机视觉  

哈希+汉明距离进行相似性度量

哈希算法

aHash

  1. 定义

    aHash 基于低频的均值哈希 :过于严格 更适合搜索缩略图

  2. 算法步骤

    • 缩小图片尺寸
    • 将其化为灰度图
    • 计算灰度均值
    • 根据与灰度均值的对比得到二值图
    • 将二值图按序组合成哈希值(指纹)
  3. 代码实现(python)

    def get_aHash(image_dir):
     from functools import reduce
     image = Image.open(image_dir).resize((8, 8), Image.ANTIALIAS).convert('L')
     avg = reduce((lambda x,y:x+y),image.getdata())/64
     #aHash_value_binary = reduce(lambda x,y: str(x)+str(y),map(lambda i: 0 if i < avg else 1, image.getdata())) # 二进制表示
     aHash_value_decimal = reduce(lambda x, y_z: x | (y_z[1] << y_z[0]),enumerate(map(lambda i: 0 if i < avg else 1, image.getdata())),0)
     return aHash_value_decimal
    

pHash

  1. 定义

    pHash 增强版的低频感知哈希算法:避免伽马校正或颜色直方图被调整带来的影响

  2. 算法步骤

    • 缩小图片尺寸
    • 将其化为灰度图
    • 计算图像的DCT变换
    • 缩小DCT
    • 计算DCT的均值
    • 对比判断得到二值图
    • 二值图按序组合成哈希值(指纹)
  3. 代码实现(python)

    def get_pHash(image_dir):
     import cv2
     from functools import reduce
     image = cv2.imread(image_dir,cv2.IMREAD_GRAYSCALE)
     image = cv2.resize(image,(32,32),interpolation=cv2.INTER_AREA)
     image = image.astype('float')
     image = cv2.dct(image) 
     image = cv2.resize(image,(8,8))
     avg_dct = sum(sum(image))/64
     image = sum(image.tolist(),[])
     #pHash_value_binary = reduce(lambda x,y:str(x)+str(y),map(lambda x: 0 if x<avg_dct else 1 , image[::-1]))  #组合顺序无所谓只要比较的图片一致就可以
     pHash_value_decimal = reduce(lambda x, y_z: x | (y_z[1] << y_z[0]),enumerate(map(lambda i: 0 if i < avg_dct else 1, image)),0)
     return pHash_value_decimal
    

dHash

  1. 定义

    dHash 差异哈希算法:比pHash速度快 比aHash效果好

  2. 算法步骤

    • 缩小图片尺寸(9*8)
    • 将其化为灰度图
    • 计算差异值(每行相邻两值比较大小)得到二值图
    • 将二值图按序组合成哈希值(指纹)
  3. 代码实现(python)

     @param:图片路径
     @return:图像差异哈希的十进制表示
    
     def get_dHash(image_dir):
         import cv2
         image = cv2.imread(image_dir,cv2.IMREAD_GRAYSCALE)
         image = cv2.resize(image,(9,8),interpolation=cv2.INTER_AREA)
         image_list = sum(image.tolist(),[])
         hashString = ''
         for i in range(1,len(image_list)):
             if i%(image.shape[1])!=0:
                 if image_list[i-1]>image_list[i]:
                     hashString += '1'
                 else:
                     hashString += '0'
         dHash_value_decimal = int(hashString,2)
         return dHash_value_decimal 
    

haming distance (汉明距离)

  1. 定义

    在信息论中,两个等长字符串之间的汉明距离(英语:Hamming distance)是两个字符串对应位置的不同字符的个数。换句话说,它就是将一个字符串变换成另外一个字符串所需要替换的字符个数。

  2. 代码实现(python)

     @param: 两个要比较的哈希值
     @return:距离(不匹配个数)
     def hamming(h1,h2):
         d = h1^h2
         res = bin(d).count('1')
         return res   
    

补充

  1. python中可直接调用imagehash library 中的方法
安装:pip install imagehash
方法:
    phash(image, hash_size=8, highfreq_factor=4)
    average_hash(image, hash_size=8)
    dhash(image, hash_size=8)
    whash(image, hash_size = 8, image_scale = None, mode = 'haar', remove_max_haar_ll = True)
  1. 在大规模图像搜索时,可以将图片的hash特征存储在es中,然后进行匹配搜索
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u014448054/article/details/104007986

智能推荐

pandas.corr()相关检验方法的选择_csdn_youth0605的博客-程序员ITS301

连续变量之间的检验,用pearson系数(服从正态分布);离散变量或非正态分布连续变量之间的检验,用spearman或者kendall系数;连续与离散变量之间,可以考虑Kendall、卡方检验。spearman相关系数范围:0.2-0.4弱正相关,0.4-0.6算是中等相关,0.6-0.8达到强正相关。pearson相关系数范围:0.8-1.0 极强相关0.6-0.8 强相...

主板bios修改、刷新_weixin_34162695的博客-程序员ITS301

2010-10-19:由于下面几个文件被大量下载,导致我的cnblogs下载功能被停用。决定把这几个文件删除了,有需要的到bios.net.cn下载即可。 bios修改: AMI自助修改工具AMITool 1.47 (2010.01.20)AMI自助修改工具AMITool 1.47 (2010.01.20)ed2k下载 使用说明:http://bbs.bios.net.cn/...

偏最小二乘法_小木匠_的博客-程序员ITS301_偏最小二乘法

偏最小二乘回归是一种新型的多元统计数据分析方法,它与1983年由伍德和阿巴诺等人首次提出。近十年来,它在理论、方法和应用方面都得到了迅速的发展。密西根大学的弗耐尔教授称偏最小二乘回归为第二代回归分析方法。偏最小二乘回归方法在统计应用中的重要性主要的有以下几个方面:(1)偏最小二乘回归是一种多因变量对多自变量的回归建模方法。(2)偏最小二乘回归可以较好地解决许多以往用普通多元回归无法解决

学习笔记:ACL访问控制列表(包过滤技术)_路慢修远兮的博客-程序员ITS301

ACL访问控制列表(包过滤技术)欢迎使用Markdown编辑器1.过滤点2.ACL的分类重难点访问ACL原理编写ACL的规则命令标准ACL命令扩展ACL命令创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章FLowchart流程图导出与导入导出欢迎使用Markdown编辑器1.过滤点主要...

STM32F103之DMA寄存器移植笔记_物极必反1024的博客-程序员ITS301

一、DMA 简介直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输,无须CPU干预。数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。一共两个DMA控制器,DMA1 7个通道,DMA2有5个通道。每个通道专门用来管理来自于一个或多个外设对存储器访问的请求,还有一个仲裁器来协调各个DMA请求的优先权。就是有两个DMA,每个DMA有多个通道,...

随便推点

iOS-关于真机调试那些事_weixin_34301307的博客-程序员ITS301

2019独角兽企业重金招聘Python工程师标准&gt;&gt;&gt; ...

python区块链框架_blockchain 开源教程:从零开始写区块链_weixin_39669163的博客-程序员ITS301

blockchain 开源教程:从零开始写区块链介绍这个教程最终完成后,是一个支持物联网设备的专门用于追溯的无币区块链。目前区块链项目的名字还没有确定,但本教程一旦完成,该项目会立刻启动。说明每个文件夹里都是一个课程,都有源码。本教程目前由我本人来写,因用业余时间,因此不能保证每天都有更新。为了保持简单,本教程用python做示例,大部分只用到 list、dict、json等对象,没有使用clas...

Smartbi AutoML三步点选直接完成机器学习_思迈特Smartbi的博客-程序员ITS301

​在计算机出现之前人们就幻想着一种机器可以实现人类的思维,可以帮助人们解决问题,甚至比人类有更高的智力。人工智能是计算机科学的一个研究分支,是多年来计算机科学研究发展的结晶。人工智能是使用与传统计算机系统完全不同的工作模式,它可以依据通用的学习策略,读取海量的大数据,并从中发现规律、联系和洞见,因此人工智能能够根据新数据自动调整,而无需重设程序。目前,人工智能在金融、医疗、制造等行业得到了广泛应用。其中,机器学习是人工智能技术发展的主要方向。01机器学习:实现人工智能的高效方法从广义上来说,机器学

基于VXWORKS的NAND FLASH驱动程序设计_千山鸟飞绝万径人踪灭的博客-程序员ITS301

基于VXWORKS的NAND FLASH驱动程序设计[email protected]技术交流QQ群: 691976956目前,随着电子技术的不断发展,计算机技术也得到飞速的发展,产生了很多新技术。但就计算机 的基本结构来说,还是基本采用了冯·诺依曼结构。然而冯·诺依曼结构的一个中心点就是存储一控制,所以存储器在计算机系统中的作用是非常重要的。嵌入式计 算机作为计算机中的一个类别,对执行速度和系统...

CentOS6.5内网访问正常却上不了外网的问题解决_linlintwl的博客-程序员ITS301

现象最近发现公司的两台centos服务器(游戏服和svn服),之前一直能正常访问外网,可突然不能上外网了,但是内网可以访问这两台主机的资源。但是在这些机子上无法访问外网,导致不能git更新拉取,不能下载更新,平添了平时维护的不便。问题排查结果非DNS问题,也非IP冲突问题,而是网关的网卡地址导致。 更新网卡地址,先找到可访问外网的网卡地址,比如在当前WIN中执行 arp -a,得...

MySQL数据备份与恢复及sql语句用法_江城老K的博客-程序员ITS301

1.Mysqldump简介mysqldump是逻辑备份工具,支持MyISAM和InnoDB引擎。数据库运行时,MyISAM引擎只支持温备,InnoDB支持热备和温备。2.MySQLdump的应用2.1全量备份与恢复全量备份就是指对某一个时间点上的所有数据或应用进行的一个完全拷贝。MariaDB [(none)]&gt; show databases;+--------------------+| Database |+--------------------+| inf

推荐文章

热门文章

相关标签