opencv相似图片搜索

目录

前言

本文主要想实现的是获取两个文件夹下的所有图片,然后匹配出相近的图片。网上有许多关于图片相似匹配的资料。很多都是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和汉明距离找出相似图片
基于感知哈希算法的视觉目标跟踪

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值