Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >图像相似性:哈希和特征

图像相似性:哈希和特征

作者头像
凌虚
发布于 2020-07-17 03:51:08
发布于 2020-07-17 03:51:08
4K0
举报

如何判断图像的相似性?

直接比较图像内容的 md5 值肯定是不行的,md5 的方式只能判断像素级别完全一致。图像的基本单元是像素,如果两张图像完全相同,那么图像内容的 md5 值一定相同,然而一旦小部分像素发生变化,比如经过缩放、水印、噪声等处理,那么它们的 md5 值就会天差地别。

本文将会介绍图像相似性的两大有关概念:图像哈希、图像特征。

01

图像哈希

图像通过一系列的变换和处理最终得到的一组哈希值称之为图像的哈希值,而中间的变换和处理过程则称之为哈希算法。

下面以 Average Hash 算法为例描述这一基本过程:

1、Reduce size : 将原图压缩到 8 x 8 即 64 像素大小,忽略细节。

2、Reduce color : 灰度处理得到 64 级灰度图像。

3、Average the colors : 计算 64 级灰度均值。

4、Compute the bits : 二值化处理,将每个像素与上一步均值比较并分别记为 0 或者 1 。

5、Construct the hash : 根据上一步结果矩阵构成一个 64 bit 整数,比如按照从左到右、从上到下的顺序。最后得到的就是图像的均值哈希值。

参考:

http://www.hackerfactor.com/blog/?/archives/432-Looks-Like-It.html

如果你稍加留意,就会发现 Average Hash 均值哈希算法的处理过程相当简单,优点就是计算速度快,缺点就是局限性比较明显。

当然计算机视觉领域发展到现在已经有了多种图像哈希算法,OpenCV 支持的图像哈希算法包括:

  • AverageHash : 也叫 Different Hash.
  • PHash : Perceptual Hash.
  • MarrHildrethHash : Marr-Hildreth Operator Based Hash.
  • RadialVarianceHash : Image hash based on Radon transform.
  • BlockMeanHash : Image hash based on block mean.
  • ColorMomentHash : Image hash based on color moments.

这些哈希算法的具体实现过程不在本文的讲述范围内,我们重点关注的是他们的实际表现。

如上图所示,左下角标明了如水印、椒盐噪声、旋转、缩放、jpeg压缩、高斯噪声、高斯模糊、对比度等对抗影响,右下角则是各种哈希算法,圆锥体的高度则代表哈希算法对各种影响的抗性,高度越高说明抗性越高、越能成功匹配。

值得注意的是,不同的哈希算法输出的哈希值是不同的(在 OpenCV 中),这里是指数据类型和位数并不完全相同,结果越复杂需要的计算成本也就越高。

下面运用这些哈希算法对某张图分别计算其哈希值,观察他们的输出结果:

从上图中可以看到,ColorMomentHash 比较特别,输出的是浮点数,它也是唯一一个能够对抗旋转的哈希算法,但是也局限于 -90 ~ 90 度。

图像的哈希值提取出来了,那么下一个问题来了,如何比较两张图片的相似性?

02

Hamming distance

Hamming distance 汉明距离,指的是两个等长字符串对应位置不同字符的个数。

例如:

  • 1 0 1 1 1 0 1
  • 1 0 0 1 0 0 1

汉明距离为 2 。

两张图片之间的相似性可以通过他们的哈希值之间的汉明距离来判断,汉明距离越小则说明图片越相似,ColorMomentHash 除外。

如果我们的图片在百万以上量级,那么我们如何在实际工程应用中快速找到相似的图片?难点在于提取了所有图片构建哈希数据集后如何存储,其次如何进行百万次比较也就是计算汉明距离。

答案是构建倒排索引,例如 Elasticsearch 可以轻松实现。但是 ES 并不直接支持计算汉明距离,妄图利用模糊查询你会死的很惨,这里必须变通处理。再回到汉明距离的定义上,假设我们的图片哈希值是 64 bit 位的数据,如果按照定义则需要比较 64 次,但是我们完全可以将哈希值拆分,64 = 8 x 8,每 8 bit 构成一个比较单元,这样我们就只需要比较 8 次即可。为什么能拆分?因为我们认为相似图片即使经过拆分后比较仍然具有较好的匹配性。

显然哈希值越复杂则比较的成本越高,所以在实际应用中我们需要综合业务需求来考量具体采用哪种哈希算法。

图像哈希的方式其实可以理解为图像整体上的相似性。既然有整体,那么就有局部。

03

图像特征

「一双丹凤双角眼,两弯柳叶吊梢眉」,人脸可以有特征,那么图像呢?当然也有,只要图像具有类似的特征,那么就可以认为他们是相似的,这也就是局部相似性:

例如上面左右两张图,特征匹配,局部相似。

什么是特征?特征一定是图片的低频部分。

上图三个部分,显然蓝色圈能匹配更多,黑色圈次之,红色圈最不易匹配,如果要选择一个作为特征,当然就是红色圈。

Corner Detection : 图像特征提取的基础算法,目的在于提取图像中的 corner ,这里的 corner 可并不是四个边框角,而是图像中的具有突变特征的点,例如:

Corner detectors 最大的缺点在于无法应对伸缩情况,为了解决这个问题 SIFT 特征提取算法问世,SIFT 的全称即 Scale Invariant Feature Transform 。

Keypoint 和 Descriptor :keypoint 也就是图像的特征点,descriptor 则是对应特征点的描述因子,在 OpenCV 中,keypoint 也一组浮点数矩阵,这并不利于计算,于是可以将其转换为了整形值也就是 descriptor ,每一个特征点的 descriptor 描述因子就是一个多维向量。

SIFT 提取特征点示例:

需要注意的是一张图像的特征点是有多个的。

SIFT 算法的缺点在于计算速度太慢,SIFT 每个特征点的 descriptor 有 128 维。为此 SURF( Speeded-Up Robust Features )算法对其进行了加速优化,SURF 特征点可以是 64 维,也可以转换为 128 维。

SIFT 和 SURF 算法都是有专利的,这意味着你有责任和义务向其付费,然而 OpenCV 团队经过自己的研究提出了一个更快速优秀且免费的 ORB ( Oriented FAST and Rotated BRIEF )算法,每个特征点更只有 32 维,减少了更多计算成本。

特征点提取出来了,怎么通过特征点去比较图像的相似性?两个特征点之间的汉明距离小于一定程度,则我们认为这两个特征点是匹配的,每张图像可以提取出多个特征点,匹配的特征点的个数达到我们设定的阈值,则我们就可以认为这两张图片是相似的。

04

结语

相同图像像素级别完全相同,相似图片则分为两级,图像哈希对应整体相似,图像特征对应局部相似。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-03-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Node Python Go全栈开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
图片相似性匹配中的特征提取方法综述
stevenmiao(苗捷),2016年7月博士毕业于华南理工大学,应届毕业加入TEG信息安全部。八年计算机视觉算法经验,博士期间主要研究面向视频的特征提取和内容识别算法。入职以来主要负责部门内基于大规模图像和视频检索、匹配的恶意内容过滤算法。 一、引言 图片相似性匹配,即对比两张图片的相似程度,可以用于图片搜索、聚类、版权保护、恶意图片过滤等应用。本文主要介绍用于图片相似性匹配的特征各类特征提取方法。对于图片的相似性匹配,可根据匹配的形式分为四个层次,分别概括如下: 1.像素级别相似:两张图片每个对应
TEG云端专业号
2018/03/14
5.7K0
图片相似性匹配中的特征提取方法综述
全面综述:图像特征提取与匹配技术
链接 | https://zhuanlan.zhihu.com/p/133301967
AI算法与图像处理
2020/08/28
6.2K0
全面综述:图像特征提取与匹配技术
使用OpenCV进行图像全景拼接
图像拼接是计算机视觉中最成功的应用之一。如今,很难找到不包含此功能的手机或图像处理API。在本文中,我们将讨论如何使用Python和OpenCV进行图像拼接。也就是,给定两张共享某些公共区域的图像,目标是“缝合”它们并创建一个全景图像场景。当然也可以是给定多张图像,但是总会转换成两张共享某些公共区域图像拼接的问题,因此本文以最简单的形式进行介绍。
小白学视觉
2022/01/18
2K0
使用OpenCV进行图像全景拼接
【图像配准】多图配准/不同特征提取算法/匹配器比较测试
本文首先完成之前专栏前置博文未完成的多图配准拼接任务,其次对不同特征提取器/匹配器效率进行进一步实验探究。
zstar
2023/02/13
4.2K0
【图像配准】多图配准/不同特征提取算法/匹配器比较测试
目标跟踪基础:两张图片相似度算法
不管是传统的目标跟踪中的生成模型和判别模型,还是用深度学习来做目标跟踪,本质上都是来求取目标区域与搜索区域的相似度,这就是典型的多输入。
一点人工一点智能
2023/07/08
3.2K0
目标跟踪基础:两张图片相似度算法
以图搜图系统概述
构建一个以图搜图系统需要解决两个最关键的问题:首先,提取图像特征;其次,特征数据搜索引擎,即特征数据构建成数据库并提供相似性搜索的功能。
凌虚
2020/07/17
1.7K0
OpenCV特征点提取----Fast特征
1.FAST(featuresfrom accelerated segment test)算法
流川疯
2022/05/06
1.6K0
OpenCV特征点提取----Fast特征
超详讲解图像拼接/全景图原理和应用 | 附源码
我们探索了许多特征提取算子,如SIFT,SURF,BRISK和ORB。你可以使用这款Colab笔记本,甚至可以用你的照片试试。[这里我已经调试好源码并上传到github上面]
AI算法与图像处理
2019/09/17
9.9K2
超详讲解图像拼接/全景图原理和应用 | 附源码
干货 | 基于特征的图像配准用于缺陷检测
经典的特征匹配算法有SIFT、SURF、ORB等,这三种方法在OpenCV里面都已实现。SURF基本就是SIFT的全面升级版,有 SURF基本就不用考虑SIFT,而ORB的强点在于计算时间,以下具体比较:
OpenCV学堂
2020/03/18
3K0
图像检索系列——利用 Python 检测图像相似度
最近在做一个海量图片检索的项目,可以简单的理解为“以图搜图”,这个功能一开始是搜索引擎带火的,但是后来在电商领域变得非常实用。在制作这个图片检索的项目前,笔者搜索了一些资料,如今项目临近结尾,便在这里做一些简单的分享。本文先介绍图像检索最基础的一部分知识——利用 Python 检测图像相似度。
出其东门
2019/08/26
5.1K0
图像检索系列——利用 Python 检测图像相似度
【5】OpenCV2.4.9实现图像拼接与融合方法【SURF、SIFT、ORB、FAST、Harris角点 、stitch 】
本文出现的数据结果和码源见:https://download.csdn.net/download/sinat_39620217/18269470
汀丶人工智能
2022/12/21
3K0
【5】OpenCV2.4.9实现图像拼接与融合方法【SURF、SIFT、ORB、FAST、Harris角点 、stitch 】
高翔Slambook第七讲代码解读(特征点提取)
作为一个视觉SLAM的入门学徒,高翔的书我看了一遍,视频也跟了一遍,代码在自己的电脑上也跑过,但总觉得跟啥都没学没有太大区别。
小白学视觉
2019/10/24
1.5K0
基于图像识别的自动化
导语 在客户端自动化中,如果需要对UI进行操作,控件识别和操作是最基础的能力。在windows标准控件中,我们可以通过FindWindow来找到窗口,FindWindowEx来找到子窗口和按钮,在selenium测试web页面,我们通过find_element_by_xpath、find_element_by_css_selector、find_element_by_id等等来找到页面元素。但是,在大多数应用程序中使用的都是非标准的控件,无法通过FindWindowEx来找到某个按钮,也无法通过某个ID来找
1007261
2018/01/15
8.2K0
基于图像识别的自动化
OpenCV特征点检测------Surf(特征点篇)
Surf算法的原理                                                                          
流川疯
2022/05/06
1.8K1
OpenCV特征点检测------Surf(特征点篇)
ORB图像特征检测
#ORB算法推导 ORB采用FAST (features from accelerated segment test) 算法来检测特征点。FAST核心思想就是找出那些卓尔不群的点,即拿一个点跟它周围的点比较,如果它和其中大部分的点都不一样就可以认为它是一个特征点。 首先来做几个定义: U : 参考像素点周围的区域阈值 t : 与参考像素点作对比的阈值点的灰度值当参考点的灰度值之差的绝对值大于t时,我们认为这两个点不相同 Gp : 像素点的灰度值 u : 区域阈值内不同的像素点数量 Un : 区域阈
Pulsar-V
2018/04/18
1.1K0
ORB图像特征检测
python图像识别---------图片相似度计算
要识别两张图片是否相似,首先我们可能会区分这两张图是人物照,还是风景照等......对应的风景照是蓝天还是大海......做一系列的分类。
andrew_a
2019/07/30
11.7K0
python图像识别---------图片相似度计算
相似性︱python+opencv实现pHash算法+hamming距离(simhash)(三)
本文介绍了如何使用Python和OpenCV库实现图像的局部敏感哈希(LSH)算法,并通过具体实验展示了该算法的有效性。同时,本文还探讨了如何将LSH算法应用于海量数据查找中,提供了一种高效的海量数据查找方法。
悟乙己
2018/01/02
4.9K0
相似性︱python+opencv实现pHash算法+hamming距离(simhash)(三)
基于内容的图像检索技术综述-传统经典方法
今天我们来介绍一下图片检索技术,图片检索就是拿一张待识别图片,去从海量的图片库中找到和待识别图片最相近的图片。这种操作在以前依靠图片名搜图的时代是难以想象的,直到出现了CBIR(Content-based image retrieval)技术,依靠图片的内容去搜图。比较常见的图搜平台有百度、谷歌、拍立淘等,有些图搜技术已经能达到非常不错的效果。接下来我们做个测试,给出一个柯基宝宝的图片,分别用三家搜索引擎进行搜索:
SIGAI学习与实践平台
2018/08/07
5190
基于内容的图像检索技术综述-传统经典方法
图像处理之特征提取
知乎上看到一个话题—— 目前火热的 Deep Learning 会灭绝传统的 SIFT / SURF 特征提取方法吗? ---- 由于之前研究过SIFT和HOG这两种传统的特征提取方法,故本篇文章先对SIFT和HOG作一综述,并比较二者优缺点。之后,将SIFT和HOG同神经网络特征提取做一对比,浅谈对上述问题的看法。如果能写得快一些,再简单介绍其他几种传统的特征提取的方法——SURF、ORB、LBP、HAAR等等。 ---- 目录 [1] SIFT(尺度不变特征变换) [2] HOG(方向梯度直方图)
echobingo
2018/04/25
5.7K0
图像处理之特征提取
OpenCV进行图像相似度对比的几种办法
PSNR(Peak Signal to Noise Ratio),一种全参考的图像质量评价指标。
流川疯
2019/01/18
6.8K0
推荐阅读
相关推荐
图片相似性匹配中的特征提取方法综述
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档