目录

  • 目录
  • 前言
  • 感知哈希算法
    • ahash

      • ahash理论
    • 增强版pHash算法
      • 理论部分
      • 代码部分
  • 总结
  • 链接地址

前言

本文主要想实现的是获取两个文件夹下的所有图片,然后匹配出相近的图片。网上有许多关于图片相似匹配的资料。很多都是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相似图片搜索相关推荐

  1. Google 图片搜索的原理是什么?

    Google 图片搜索的原理是什么? 1 条评论 分享 按投票排序按时间排序 18 个回答 389赞同 反对,不会显示你的姓名 知乎用户,安全行业 XsXs.知乎用户.知乎用户 等人赞同 针对这个问题 ...

  2. 通过opencv在图片上加上文字_基于Ubuntu16

    本文主要介绍,如何通过**C++**语言在Ubuntu操作系统下的OpenCV中将一个图片叠加上文字 通过opencv在图片上叠加上文字 一.汉字点阵字库原理 1.汉字的三种编码 1.1区位码 1.2 ...

  3. 利用OpenCV识别图片背景是否透明

    因为公司的需求,有几百万张图片需要识别,筛选出背景是透明的图片,我上网找了一圈也没看到成熟的方案,于是自己想了一个比较简陋但是还算是挺好用的方案. 大概的图片就是这些种类吧,图一图三是我想要筛选出来的 ...

  4. 基于Python的QQ音乐音频图片搜索系统设计与实现 毕业论文+源码

    下载地址:https://download.csdn.net/download/m0_61837203/23769927 目录 爬虫: 1 一.库 1 二.实现功能 2 三.实现过程 2 四.难点 3 ...

  5. python怎么换背景颜色_用opencv给图片换背景色的示例代码

    图像平滑 模糊/平滑图片来消除图片噪声 OpenCV函数:cv2.blur(), cv2.GaussianBlur(), cv2.medianBlur(), cv2.bilateralFilter() ...

  6. 基于Python的QQ音乐音频图片搜索系统

    资源下载地址:https://download.csdn.net/download/sheziqiong/85798547 资源下载地址:https://download.csdn.net/downl ...

  7. OpenCV实现图片搜索引擎

    OpenCV(Open Source Computer Vision Library)的计算效率很高且能够完成实时任务.OpenCV库由优化的C/C++代码编写而成,能够充分发挥多核处理和硬件加速的优 ...

  8. 相似图片搜索原理一(ahash—c++实现)

    ahash,全称叫做average hash,应该是phash(perceptual hash, 感知哈希)算法的一种.是基于图像内容搜索最简单的一种(search image by image),因 ...

  9. 基于Opencv的图片人脸检测

    本篇内容介绍如何使用opencv,scipy,tensorflow来实现计算机人脸检测.(用一点也是用 =.=) 先声明一下,本篇内容是在图片中的人脸检测, 调动计算机摄像头的人脸识别链接: 链接:h ...

  10. python图片旋转脚本_Python+OpenCV 实现图片无损旋转90°且无黑边

    0. 引言 有如上一张图片,在以往的图像旋转处理中,往往得到如图所示的图片. 然而,在进行一些其他图像处理或者图像展示时,黑边带来了一些不便.本文解决图片旋转后出现黑边的问题,实现了图片尺寸不变的旋转 ...

最新文章

  1. windows-台式机添加硬盘后如何加载、格式化新的分区
  2. python编程入门书籍推荐-给刚入门python的朋友推荐几本书
  3. 【转摘】IT人日常的学习—中国消费产业的基本盘和机遇
  4. linux c语言 ppt,linux操作系统下c语言编程入门.ppt
  5. Git代码管理常用命令操作
  6. 关于微信红包的架构思考
  7. mysql hive索引_Hive数据仓库--HiveQL视图和索引
  8. 小师妹学JavaIO之:用Selector来发好人卡
  9. openssh arm linux 编译,openssh编译安装到ARM嵌入式系统中
  10. 【Python笔记】网络爬虫——介绍
  11. webstorm 2017 2016 各个版本 激活破解大全 实测可用
  12. 怎么修改windows8的主题桌面
  13. php转为json格式,如何将PHP数据转换为json格式?
  14. (附源码)计算机毕业设计SSM基于图书管理系统
  15. iOS 游戏开发教程资源
  16. Python大众点评店铺刷好评
  17. 2. 详解 QEMU 架构
  18. 面试总结 -记周六校招笔试
  19. 国外也有“天价流量账单” 看看都什么情况?
  20. 移动互联网的未来在非洲

热门文章

  1. 程序员自我修养阅读笔记——Windows PE/COFF
  2. Linux下添加开机启动,Linux设置程序开机自启动
  3. 分享我用H5打造微信公众号吸粉引流的恶搞方法
  4. 谷歌浏览器扩展程序XDM_如何下载和安装扩展程序?
  5. 【转】代价曲线的理解
  6. 如何申请美国、加拿大、英国的电话号码
  7. JAVA开发常见单词(*)
  8. 3DMax与Unity统一长度单位和轴
  9. uipath sequence传递参数_湛江压铸模温机工作原理参数图
  10. 如何成为数据分析师?小白这样做,快速入门数据分析