图像哈希算法

article/2025/5/14 5:34:08

最近在回顾一些经典的图像哈希算法,本文大致介绍了一些常用的图像哈希算法,暂时先列一个框架,待日后补充。

参考链接: 
【1】基于内容的图像哈希算法研究 
【2】图像聚类-谱聚类 
【3】球哈希Spherical Hashing

部分哈希源码及大牛的链接:图像检索:Hashing图像检索源码及数据库总结


一、单模态哈希:

LSH (Locality Sensitive Hashing,局部敏感哈希)

论文链接:Approximate Nearest Neighbors: Towards Removing the Curse of Dimensionality - STOC1998 
LSH扩展及实现链接:LSH Algorithm and Implementation (E2LSH)

局部敏感哈希是最初的用来做图像哈希索引的算法,基本思想是使用一组哈希函数将数据散列到不同的桶中,即令相近的数据落在同一个哈希桶中,越相似的数据落到同一个桶中的概率越大。

下图描述了LSH算法流程: 
这里写图片描述

SH (Spectral Hashing,谱哈希)

论文及其实现链接:Spectral Hashing and its Implementation - NIPS08

谱哈希首先分析和总结了图像哈希编码应满足的条件,即: 
( 1)获得新图像哈希编码的算法易于实现; 
( 2) 语义相同的图像有相同或相近的哈希编码序列,语义不同的图像得出差异性较大的哈希编码序列; 
( 3) 图像的内容特征用较短的哈希编码序列就能表示。

为达到这三个条件的要求,谱哈希将编码过程视为图分割过程,对高维数据集进行谱分析,通过放松约束条件将问题转化成拉普拉斯特征图的降维问题,从而求解得到图像数据的哈希编码。

(推导省略)

SH算法的步骤: 
第一步: 采用主成分分析(PCA)算法获取图像数据的各个主成分方向; 
第二步:在每个主成分方向按论文公式(5)计算特征值,并选取前 r 个最小的值,总共得到 r * d 个特征值, 再将其按从小到大的顺序排序,取前 r 个最小的特征值,计算其对应的特征函数值; 
第三步:将特征函数值在零点进行二元量化(sign函数)得到哈希编码。

主成分分析(PCA)算法是最常用的降维算法之一,但每个主成分方向上的方差是不同的,方差较大的主成分方向包含更多的信息。在每个主成分方向上用相同长度的二元码对图像进行编码是不合理的,因此谱哈希为方差大的主成分方向分配更多的比特。

谱哈希的缺点是它有两个条件在实际情况中很难同时得到满足,即假设数据是从多维均匀分布中采样得到的而且要求不同维度上的哈希编码之间相互独立,因此谱哈希的广泛使用受到了限制。

AGH (Anchor Graph Hashing,锚点图哈希)

论文链接:Hashing with Graphs - ICML11

AGH受谱哈希的启发,提出了与谱哈希相同的优化问题,但对目标函数的求解过程设计了自己的方案,脱离了数据是从多维均匀分布中采样得到这一先验假设的束缚,用近似邻接矩阵 A 代替邻接矩阵W (锚点图A是n*m的, 而邻接矩阵W是n*n的, m远小于n),降低了时间复杂度,具有更好的广泛适用性。 
AGH的基本思想是用数据聚类中心与每个数据样本点之间的近邻图去近似数据样本点与样本点之间的近邻图,用近似邻接矩阵代替原来的邻接矩阵。

AGH步骤如下: 
第一步:对图像训练数据集进行聚类,得到 m 个聚类中心,每个聚类中心称为一个锚点; 
第二步:建立锚点与图像训练数据中每个样本点之间的关系,称为锚点图,用矩阵 Z 表示,矩阵中每个元素使用论文中公式(2)计算; 
第三步:根据 这里写图片描述 构造近似邻接矩阵 A,最后使用论文中公式(5)(6)得到最终的哈希码。

Discrete Graph Hashing (离散图哈希)

论文链接:Discrete Graph Hashing-NIPS-14 
论文+附录:discrete-graph-hashing

简单理解:1. AGH建立锚点图;2. 去除松弛约束,直接对于离散约束求解

训练时哈希码通过对离散约束求解得来,当进行测试查询时,对于query q,B(q)=sign(Wz(q)),z(.)是一个非线性核映射(本文使用高斯核)。

SDH (监督离散哈希)

论文链接:Supervised Discrete Hashing - CVPR15

主要思想: 
1. 通过将哈希码映射到 label 标签信息上,从而不需要通过计算相似性矩阵来将标签信息嵌入到哈希码生成过程当中; 
2. 不对离散约束进行松弛,直接使用DCC算法在离散约束下按位求解哈希码

二、量化:

PQck-means在前面的一篇博客中写过,这里不再赘述,链接:量化方法之PQ and ck-means

ITQ (Iterative Quantization, 迭代量化哈希)

ITQ 是一种基于PCA的图像哈希算法,不同于谱哈希为方差大的主成分方向分配更多的比特, ITQ 通过旋转主成分方向使得旋转后各方向的方差尽量保持平衡。

ITQ步骤: 
1. 首先用 PCA 对数据进行降维并对降维后的结果进行二值量化处理得到所有数据的初始哈希编码,这样原始数据被嵌入到了汉明空间中,各数据位于超立方体的顶点上; 
2. 对主成分方向进行一次随机旋转,可以较好的平衡不同主成分方向的方差,接着对编码矩阵和旋转矩阵进行交替优化,以最小化量化误差为目标,旋转若干次后将得到局部最优解。

下图是 ITQ 的基本思想示意图: 
这里写图片描述 
红线代表主成分方向,将数据向各主成分方向投影后进行二值量化得到的编码具有较大的误差,同一类数据被不同的哈希编码序列表示了出来,也就是类似的图像落在了不同的哈希桶中。(b)对主成分方向进行了一次随机旋转,减小了投影值与哈希编码之间的量化误差。(c)是通过 ITQ 优化后得到的最终的投影向量及哈希编码序列,可以看到,此时量化误差达到最小,同一类数据落在了同一个哈希桶中。

ITQ 不同于 SH 需要假设数据集服从均匀分布,因此适用范围更广泛,而且还可以与典型相关分析算法 (Canonical Correlation Analysis, CCA) 结合,构成有监督的哈希方法,可以对具有标签的图像数据库进行检索。

DBQ

三、多模态哈希:

SCM

四、跨模态哈希:

SePH

五、深度哈希:



http://chatgpt.dhexx.cn/article/5VttvMww.shtml

相关文章

消息机制(Handle机制)

消息机制简介- Handler是Android消息机制的上层接口。Handle的使用过程简单,通过它可以轻松将一个任务切换到Handle所在的线程中去执行。通常情况下,Handle的使用场景是更新UI。 在子线程中进行耗时操作,执行完操作后,发送消息&…

魔百盒九联UNT402A_S905L3_线刷固件包_语音蓝牙正常

魔百盒九联UNT402A_S905L3_线刷固件包_语音蓝牙正常 固件特点: 1、适用于九联UNT402A; 2、开放原厂固件屏蔽的市场安装和u盘安装apk; 3、修改dns,三网通用; 4、大量精简内置的没用的软件,运行速度提升…

大规模特征向量检索算法总结 (LSH PQ HNSW)

大规模特征向量检索算法总结 (LSH PQ HNSW) 转自:https://www.6aiq.com/article/1587522027341 向量检索基本概念 向量从表现形式上就是一个一维数组。我们需要解决的问题是使用下面的公式度量距离寻找最相似的 K 个向量。 欧式距离: 两点间的真实距…

面向高光谱图像的多特征融合哈希

原文:Efficient Multiple Feature Fusion With Hashing for Hyperspectral Imagery Classification: A Comparative Study 面向高光谱图像的多特征融合哈希 I. IntroductionII. MFH FrameworkIII. Feature HashingIV. Experiment SettingA. Data SetsB. Multiple Fe…

论文笔记-迭代量化哈希ITQ

推荐一个大牛的博客:http://yongyuan.name/【这篇博文也借鉴了他的博客,建议直接看他的博文加上论文】 自己的这个就是一个论文笔记,为了自己日后复习; 【待补充...因为笔记太乱了 懒得整理 】

ITQ(Iterative Quantization)迭代量化方法详解 hash 哈希算法

看过的文章,不做记录,即便当时理解透了,过一段时间后,知识总会模糊不清。所以从现在开始,对一些自己阅读过的一些精彩的文章,悉心记录,方便自己查阅温故,当然如果对同行有所裨益的话…

time svd java代码_ITQ算法理解 - 漫长当下TIME的个人空间 - OSCHINA - 中文开源技术交流社区...

IterativeQuantization: A Procrustean Approach to Learning Binary Codes 论文理解及代码讲解 这篇文章发表在2011年CVRP上,一作是Yunchao Gong,师从Sanjiv Kumar,关于Sanjiv Kumar可以到她的HomePage上了解。 文章目的:学习保留…

Iterative Quantization,ITQ

Abstract 针对大规模的图像检索问题,论文提出了一个高效的ITQ算法。该算法先将中心化后的数据映射到超立方体的顶点上,再通过优化过程寻找一个旋转矩阵,使得数据点经过旋转后,与超立方体的顶点数据具有最小的量化误差。ITQ算法涉及…

ITQ算法理解

开发十年,就只剩下这套Java开发体系了 >>> IterativeQuantization: A Procrustean Approach to Learning Binary Codes 论文理解及代码讲解 这篇文章发表在2011年CVRP上,一作是Yunchao Gong,师从Sanjiv Kumar,关于San…

ITQ(Iterative Quantization)图像检索算法

开发十年,就只剩下这套Java开发体系了 >>> 1、文章简介 名称:Iterative Quantization:A Procrustean Approach to Learning Binary Codes 这篇文章发表与2011年CVRP(Computer Vision & Pattern Recognition),作者:Yunchao Go…

ITQ(Iterative Quantization)迭代量化方法详解

转载:http://www.yuanyong.org/cv/itq-hashing.html CVPR 2011《Iterative Quantization: A Procrustean Approach to Learning Binary Codes》论文阅读笔记。 看过的文章,不做记录,即便当时理解透了,过一段时间后,知识…

怎么查看mysql是否锁表_MySQL查看是否锁表

MySQL查看是否锁表的方法:首先进入命令窗口;然后通过执行命令“show engine innodb status\G;”查看造成死锁的sql语句,并分析索引情况即可。 可直接在mysql命令行执行:show engine innodb status\G; 查看造成死锁的sql语句,分析索引情况,然后优化sql然后show processlis…

mysql 查询 锁表_怎么查找mysql中的锁表语句?

查看sql server数据库被锁表可以用用如下语句: 也可以用如下语句: 拓展资料: 锁定数据库的一个表的区别SELECT * FROM table WITH (HOLDLOCK) 其他事务可以读取表,但不能更新删除SELECT * FROM table WITH (TABLOCKX) 其他事务不能读取表,更新和删除 SEL…

mysql中如何查看表是否被锁

https://blog.csdn.net/love666666shen/article/details/122419330 如何查看是否发生死锁 在使用mysql的时候,如何查看表是否被锁呢? 查看表被锁状态和结束死锁步骤: 1.在mysql命令行执行sql语句 use dbName; // 切换到具体数据库 show …

matlab画六面体,MATLAB绘制平行六面体

如果给出一个平行六面体(甚至其他多面体)的各个顶点坐标,如何画出这个平行六面体。 在网上找了找方法,可以参考这篇博客 matlab中patch函数详解。然后我具体查看了 Multifaceted Patches 帮助,记录下来以备后查。 绘制主要就是利用 patch 函数,patch 的一般调用格式为patch…

MATLAB离散点边界曲线的绘制

一大堆离散点有时候需要绘制边缘点,这时候可以用到boundary函数,这是MATLAB的自带函数,用机械臂的工作空间为例绘制边界曲线图: %建立机器人模型 % theta d a alpha offset L1Link([0 0 …

利用Matlab绘制两个点电荷电场线【物理软件课程设计】

物理软件课程设计 2021年6月的课程设计题目之一:设计程序,画出两个点电荷之间电场线分布图 入门级别,代码思想可能有点像C语言,本人应用物理学专业。 资源链接:(4条消息) 利用MATLAB绘制点两个电荷电场线-C文档类资…

matlab描点写函数,matlab描点并标上点的序号

使用Kinect一帧可以获取构成人脸的121个点,每个点对应一个序号,其中121个点中有20个点描绘的唇部的点,但我们只能看出有20个点对应嘴唇,并不知道这20个点的序号,所以需要使用matlab建模并找出这20点对应的序号。 程序如…

matlab画三维散点图,调节点大小和图案

找了老半天的三维散点图,都没有。后来给我摸清楚了。 你随便画个三维散点,用scatter3 这个函数画。注意,plot是二维的 plot调节大小是 markersize 这个参数,但是三维没有。 可以画出图形后,用matlab自带的图形编辑器&…

Matlab画图和点标记

从csv中导出数据,然后需要在MATLAB图中进行标记个别点,但是利用MTALB自身标记的比较丑,因此搜了一下别的方法,具体效果如下,其中的*可以改成O或者其他的自定义的符号: 具体的主要代码如下: fi…