opencv相似图片搜索
目录
- 目录
- 前言
- 感知哈希算法
- ahash
- ahash理论
- 增强版pHash算法
- 理论部分
- 代码部分
- ahash
- 总结
- 链接地址
前言
本文主要想实现的是获取两个文件夹下的所有图片,然后匹配出相近的图片。网上有许多关于图片相似匹配的资料。很多都是java/python的,据说实现起来快捷方便,也有一些C++的。虽然博主对java/python向往已久,但是目前还是使用C++比较多,有机会还是想要学习python,毕竟最近好像特别流行。本文中博主查找了一些资料,使用感知哈希算法,简单实现了图片的相似匹配。
感知哈希算法
感知哈希算法的作用是对每张图片生成一个“指纹”字符串,然后比较不同图片的指纹。结果越接近,就说明图片越相似。
ahash
ahash,全称叫做average hash,是phash算法的一种,是基于图像内容搜索最简单的一种,因此有很多局限性。主要用于由图像的缩略图搜原图,对于图像的旋转、平移、对比度和微变形都无能为力。博主使用两张基本一样的图片,只不过一张图片的人眼是闭着的,一张图片的人眼是睁开的,结果无法识别,所以很局限。
ahash理论
- 缩小尺寸
将图片缩小的8*8的尺寸,总共64个像素。这一步的作用是去除图片的细节,只保留结构、明暗等基本信息,摒弃不同尺寸、比例带来的图片差异。 - 简化色彩
将缩小后的图片,转为64级灰度。也就是说,所有像素点总共只有64种颜色。 - 计算平均值
计算所有64个像素的灰度平均值 - 比较像素的灰度
将每个像素的灰度,与平均值进行比较。大于或等于平均值记为1;小于平均值记为0。 - 计算哈希值
将上一步的比较结果,组合在一起,就构成了一个64位的整数,就是这张图片的指纹。组合的次序并不重要,只要保证所有图片都采用同样的次序就行。
得到指纹以后,就可以比较不同的图片,看64位中有多少位不一样。在理论上,这等同于计算”汉明距离”。如果不相同的数据为不超过5,说明两张图片很相似;如果大于10,说明这是两张不同的图片。
汉明距离是使用在数据传输差错控制编码里面的,汉明距离是一个概念,它表示两个(相同长度)字对应位不同的数量,我们以d(x,y)表示两个字x,y之间的汉明距离。对两个字符串进行异或运算,并统计结果为1的个数,那么这个数就是汉明距离。
这种算法的优点是简单快速,不受图片大小缩放的影响,缺点是图片的内容不能变更。如果在图片上添加文字,就无法识别。实际中,往往采用更强大的pHash算法和SIFT算法,它们能够识别图片的变形。只要变形程度不超过25%,就能匹配原图。
相似图片搜索原理一(ahash—c++实现)中提供了实现ahash的代码,但是博主经过测试发现直接把图片缩小到8*8之后,图片的相似度根本体现不出来。也就是说这种最简单的感知哈希算法没有什么用。。。
增强版pHash算法
在pHash官网,有一个demo可以选择两张图片,然后做相似度测试。而且还有代码可以下载。虽然博主没有研究,不过记录下来,以后或许用得上的!
理论部分
- 缩小尺寸
将图像缩放到32*32大小 - 简化色彩
对32*32的图像进行256色灰度化 - 计算DCT
对32*32的图像进行离散余弦变换 - 缩小DCT
DCT的结果是32*32大小的矩阵,只保留左上角的8*8的矩阵,这部分呈现了图片中最低频率。 - 计算平均值
计算DCT的均值 - 计算哈希值
8*8的像素值中大于均值的用1表示,小于的用0表示,这样得到一个64位二进制吗作为该图像的phash值。 - 计算汉明距离
计算两幅图像的哈希值之间的汉明距离,距离越小,表明两幅图像越相似;距离越大,表明两幅图像距离越大。 - 计算哈希值
代码部分
本文使用[相似图片搜索原理二相似图片搜索原理二(phash—c++实现)的代码,成功实现了对相似图片的检索,感谢这位博主!
总结
图像处理中用到了好多数学的东西,以前一直觉得数学没什么用,那些什么极限、几何啊什么的,生活中完全用不到。却没有结合自己的专业去发现数学的广泛用途!大学的确虚度了很多,不过现在努力学或许有更好的效果,到了一定的层次才有资格做某些事情吧!
链接地址
相似图片搜索的原理
相似图片搜索原理一(ahash—c++实现)
相似图片搜索原理二(phash—c++实现)
基于phash和汉明距离找出相似图片
基于感知哈希算法的视觉目标跟踪
opencv相似图片搜索相关推荐
- Google 图片搜索的原理是什么?
Google 图片搜索的原理是什么? 1 条评论 分享 按投票排序按时间排序 18 个回答 389赞同 反对,不会显示你的姓名 知乎用户,安全行业 XsXs.知乎用户.知乎用户 等人赞同 针对这个问题 ...
- 通过opencv在图片上加上文字_基于Ubuntu16
本文主要介绍,如何通过**C++**语言在Ubuntu操作系统下的OpenCV中将一个图片叠加上文字 通过opencv在图片上叠加上文字 一.汉字点阵字库原理 1.汉字的三种编码 1.1区位码 1.2 ...
- 利用OpenCV识别图片背景是否透明
因为公司的需求,有几百万张图片需要识别,筛选出背景是透明的图片,我上网找了一圈也没看到成熟的方案,于是自己想了一个比较简陋但是还算是挺好用的方案. 大概的图片就是这些种类吧,图一图三是我想要筛选出来的 ...
- 基于Python的QQ音乐音频图片搜索系统设计与实现 毕业论文+源码
下载地址:https://download.csdn.net/download/m0_61837203/23769927 目录 爬虫: 1 一.库 1 二.实现功能 2 三.实现过程 2 四.难点 3 ...
- python怎么换背景颜色_用opencv给图片换背景色的示例代码
图像平滑 模糊/平滑图片来消除图片噪声 OpenCV函数:cv2.blur(), cv2.GaussianBlur(), cv2.medianBlur(), cv2.bilateralFilter() ...
- 基于Python的QQ音乐音频图片搜索系统
资源下载地址:https://download.csdn.net/download/sheziqiong/85798547 资源下载地址:https://download.csdn.net/downl ...
- OpenCV实现图片搜索引擎
OpenCV(Open Source Computer Vision Library)的计算效率很高且能够完成实时任务.OpenCV库由优化的C/C++代码编写而成,能够充分发挥多核处理和硬件加速的优 ...
- 相似图片搜索原理一(ahash—c++实现)
ahash,全称叫做average hash,应该是phash(perceptual hash, 感知哈希)算法的一种.是基于图像内容搜索最简单的一种(search image by image),因 ...
- 基于Opencv的图片人脸检测
本篇内容介绍如何使用opencv,scipy,tensorflow来实现计算机人脸检测.(用一点也是用 =.=) 先声明一下,本篇内容是在图片中的人脸检测, 调动计算机摄像头的人脸识别链接: 链接:h ...
- python图片旋转脚本_Python+OpenCV 实现图片无损旋转90°且无黑边
0. 引言 有如上一张图片,在以往的图像旋转处理中,往往得到如图所示的图片. 然而,在进行一些其他图像处理或者图像展示时,黑边带来了一些不便.本文解决图片旋转后出现黑边的问题,实现了图片尺寸不变的旋转 ...
最新文章
- windows-台式机添加硬盘后如何加载、格式化新的分区
- python编程入门书籍推荐-给刚入门python的朋友推荐几本书
- 【转摘】IT人日常的学习—中国消费产业的基本盘和机遇
- linux c语言 ppt,linux操作系统下c语言编程入门.ppt
- Git代码管理常用命令操作
- 关于微信红包的架构思考
- mysql hive索引_Hive数据仓库--HiveQL视图和索引
- 小师妹学JavaIO之:用Selector来发好人卡
- openssh arm linux 编译,openssh编译安装到ARM嵌入式系统中
- 【Python笔记】网络爬虫——介绍
- webstorm 2017 2016 各个版本 激活破解大全 实测可用
- 怎么修改windows8的主题桌面
- php转为json格式,如何将PHP数据转换为json格式?
- (附源码)计算机毕业设计SSM基于图书管理系统
- iOS 游戏开发教程资源
- Python大众点评店铺刷好评
- 2. 详解 QEMU 架构
- 面试总结 -记周六校招笔试
- 国外也有“天价流量账单” 看看都什么情况?
- 移动互联网的未来在非洲