您当前的位置:首页 > 电脑百科 > 程序开发 > 算法

比较图片相似算法

时间:2019-10-16 10:55:03  来源:  作者:

概述

一般情况下, 图片相似算法分为三种

  • 均值Hash算法
  • 差异值hash算法
  • 感知hash算法

其实三个算法差不多. 我们以均值hash算法为例, 算法的步骤如下:

  1. 缩放为n*n的图片
  2. 去色, 获取灰度图
  3. 得到hash指纹
  4. 比较hash指纹的汉明距离, 得到相似值

上面算法的不同, 主要是得到hash指纹的算法不同

均值hash算法

我们举例说明. 原图如下:

比较图片相似算法

 

缩放为8*8的图片

代码:

img = cv2.resize(img, (8, 8), interpolation=cv2.INTER_CUBIC)
复制代码

缩放结果

比较图片相似算法

 

去色

代码

gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
复制代码

结果:

比较图片相似算法

 

计算灰度平均值

 # 计算灰度平均值
 for i in range(8):
 for j in range(8):
 s = s + gray_img[i, j]
 avg = s / 64
复制代码

计算结果为176

计算Hash指纹

计算方法为, 如果该点灰度值大于平均灰度值, 这为1, 否则为0, 代码如下:

 # 如果值大于灰度值, 则为1, 否则为0. 生成hash指纹
 for i in range(8):
 for j in range(8):
 if gray_img[i, j] > avg:
 hash_str = hash_str + '1'
 else:
 hash_str = hash_str + '0'
复制代码

计算汉明距离

汉明距离: 在信息论中,两个等长字符串之间的汉明距离(英语:Hamming distance)是两个字符串对应位置的不同字符的个数。 代码:

def cmp_hash(hash_1, hash_2):
 # 计算汉明距离
 n = 0
 if len(hash_1) != len(hash_2):
 return -1
 for i in range(len(hash_1)):
 if hash_1[i] != hash_2[i]:
 n = n + 1
 return n
复制代码

差异值hash算法

前面缩放, 置灰, 计算汉明距离等和平均值hash算法一样, 区别在于计算hash指纹的算法不同. 该处算法为: 如果前一个像素大于后一个像素的灰度值, 则为1, 否则为0. 完整的算法如下:

# 差值感应hash
def b_hash(img):
 # 缩放到8*8的图片
 img = cv2.resize(img, (9, 8), interpolation=cv2.INTER_CUBIC)
 # 得到灰度图
 gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 hash_str = ''
 # 如果前一个像素比后一个大, 则为1, 否则为0. 生成hash指纹
 for i in range(8):
 for j in range(8):
 if gray_img[i, j] > gray_img[i, j + 1]:
 hash_str = hash_str + '1'
 else:
 hash_str = hash_str + '0'
 return hash_str
复制代码

感知Hash算法

前面两种比较图片相似的算法很好理解. 感应Hash算法的思想与之不同. 我们换一种角度来看待一张图片. 一个图片其实就是二维的信息图谱, 有各种频率的变化, 频率高的地方代表颜色的变换比较大, 例如轮廓部分. 我们可以利用DCT变换(离散余弦变换)得到频域图. 比较低频部分(为什么要比较低频部分?) 是否相似就可以了.

原图还是上面的原图. 我们先进行缩放, 缩放为32*32的部分

比较图片相似算法

 

灰度处理

比较图片相似算法

 

进行DCT变换

比较图片相似算法

 

我们拿到左上角的8*8的区域, 根据平均值hash算法比较这个灰度图的汉明距离

完整的代码如下:

# 感知hash
def p_hash(img):
 # 缩放到32 * 32
 img = cv2.resize(img, (32, 32), interpolation=cv2.INTER_CUBIC)
 cv2.imwrite("bb.jpg", img)
 # 得到灰度图
 gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 gray_img = gray_img.astype(np.float32)
 cv2.imwrite("cc.jpg", gray_img)
 # 进行离散余弦变换, 目的是将低频部分放到左上角
 img = cv2.dct(gray_img)
 cv2.imwrite("dd.jpg", img)
 # 得到左上角8*8 的频率图
 img = img[0:8, 0:8]
 avg = 0
 # 与得到低频图的平均灰度
 hash_str = ''
 for i in range(8):
 for j in range(8):
 avg += img[i, j]
 avg = avg / 64
 # 如果低频图的像素值大于平均灰度, 则为1, 否则为0. 依次生成hash指纹
 for i in range(8):
 for j in range(8):
 if img[i, j] > avg:
 hash_str = hash_str + '1'
 else:
 hash_str = hash_str + '0'
 return hash_str
复制代码

参考文献:K码农-http://kmanong.top/kmn/qxw/form/home?top_cate=28



Tags:算法   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
前言Kafka 中有很多延时操作,比如对于耗时的网络请求(比如 Produce 是等待 ISR 副本复制成功)会被封装成 DelayOperation 进行延迟处理操作,防止阻塞 Kafka请求处理线程。Kafka...【详细内容】
2021-12-27  Tags: 算法  点击:(1)  评论:(0)  加入收藏
分稀疏重建和稠密重建两类:稀疏重建:使用RGB相机SLAMOrb-slam,Orb-slam2,orb-slam3:工程地址在: http://webdiis.unizar.es/~raulmur/orbslam/ DSO(Direct Sparse Odometry)因为...【详细内容】
2021-12-23  Tags: 算法  点击:(7)  评论:(0)  加入收藏
一、什么是冒泡排序1.1、文字描述冒泡排序是一种简单的排序算法。它重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地...【详细内容】
2021-12-15  Tags: 算法  点击:(16)  评论:(0)  加入收藏
前面文章在谈论分布式唯一ID生成的时候,有提到雪花算法,这一次,我们详细点讲解,只讲它。SnowFlake算法据国家大气研究中心的查尔斯·奈特称,一般的雪花大约由10^19个水分子...【详细内容】
2021-11-17  Tags: 算法  点击:(24)  评论:(0)  加入收藏
基于算法的业务或者说AI的应用在这几年发展得很快。但是,在实际应用的场景中,我们经常会遇到一些非常奇怪的偏差现象。例如,Facebook将黑人标记为灵长类动物、城市图像识别系统...【详细内容】
2021-11-08  Tags: 算法  点击:(32)  评论:(0)  加入收藏
随着注册制的加速推进,新股越来越多,截止到今天A股上市公司的总数高达4500余家,A股一直就是重融资,轻投资的市场,而上市公司发行可转债这种再融资的(圈钱方式)是最能让普通投资者接...【详细内容】
2021-11-05  Tags: 算法  点击:(98)  评论:(0)  加入收藏
导读:在大数据时代,对复杂数据结构中的各数据项进行有效的排序和查找的能力非常重要,因为很多现代算法都需要用到它。在为数据恰当选择排序和查找策略时,需要根据数据的规模和类型进行判断。尽管不同策略最终得到的结果完...【详细内容】
2021-11-04  Tags: 算法  点击:(40)  评论:(0)  加入收藏
这是我在网上找的资源的一个总结,会先给出一个我看了觉得还行的关于算法的讲解,再配上实现的代码: Original author: Bill_Hoo Original Address: http://blog.sina.com.cn/s/bl...【详细内容】
2021-11-04  Tags: 算法  点击:(36)  评论:(0)  加入收藏
每个人都有过这样的经历:打开手机准备回消息或打电话,一看到微信图标右上方的小红点,于是忍不住先打开微信;看完微信,不知不觉又被另一个App牵引,直到关闭手机屏幕才发现自己早已...【详细内容】
2021-11-03  Tags: 算法  点击:(30)  评论:(0)  加入收藏
文丨互联网怪盗团在互联网行业,尤其是在投资人心目中,往往存在一种“算法迷信”或曰“技术迷信”:某公司的广告变现做得好,一定是因为有算法;某公司的云计算业务开展的好,也是因为...【详细内容】
2021-11-03  Tags: 算法  点击:(25)  评论:(0)  加入收藏
▌简易百科推荐
前言Kafka 中有很多延时操作,比如对于耗时的网络请求(比如 Produce 是等待 ISR 副本复制成功)会被封装成 DelayOperation 进行延迟处理操作,防止阻塞 Kafka请求处理线程。Kafka...【详细内容】
2021-12-27  Java技术那些事    Tags:时间轮   点击:(1)  评论:(0)  加入收藏
博雯 发自 凹非寺量子位 报道 | 公众号 QbitAI在炼丹过程中,为了减少训练所需资源,MLer有时会将大型复杂的大模型“蒸馏”为较小的模型,同时还要保证与压缩前相当的结果。这就...【详细内容】
2021-12-24  量子位    Tags:蒸馏法   点击:(11)  评论:(0)  加入收藏
分稀疏重建和稠密重建两类:稀疏重建:使用RGB相机SLAMOrb-slam,Orb-slam2,orb-slam3:工程地址在: http://webdiis.unizar.es/~raulmur/orbslam/ DSO(Direct Sparse Odometry)因为...【详细内容】
2021-12-23  老师明明可以靠颜值    Tags:算法   点击:(7)  评论:(0)  加入收藏
1. 基本概念希尔排序又叫递减增量排序算法,它是在直接插入排序算法的基础上进行改进而来的,综合来说它的效率肯定是要高于直接插入排序算法的;希尔排序是一种不稳定的排序算法...【详细内容】
2021-12-22  青石野草    Tags:希尔排序   点击:(6)  评论:(0)  加入收藏
ROP是一种技巧,我们对execve函数进行拼凑来进行system /bin/sh。栈迁移的特征是溢出0x10个字符,在本次getshell中,还碰到了如何利用printf函数来进行canary的泄露。ROP+栈迁移...【详细内容】
2021-12-15  星云博创    Tags:栈迁移   点击:(22)  评论:(0)  加入收藏
一、什么是冒泡排序1.1、文字描述冒泡排序是一种简单的排序算法。它重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地...【详细内容】
2021-12-15    晓掌柜丶韶华  Tags:排序算法   点击:(16)  评论:(0)  加入收藏
在了解golang的map之前,我们需要了解哈希这个概念。哈希表,又称散列表(Hash table),是根据键(key)而直接访问在内存储存位置的数据结构。也就是说,它通过计算出一个键值的函数,将...【详细内容】
2021-12-07  一棵梧桐木    Tags:哈希表   点击:(14)  评论:(0)  加入收藏
前面文章在谈论分布式唯一ID生成的时候,有提到雪花算法,这一次,我们详细点讲解,只讲它。SnowFlake算法据国家大气研究中心的查尔斯·奈特称,一般的雪花大约由10^19个水分子...【详细内容】
2021-11-17  小心程序猿QAQ    Tags:雪花算法   点击:(24)  评论:(0)  加入收藏
导读:在大数据时代,对复杂数据结构中的各数据项进行有效的排序和查找的能力非常重要,因为很多现代算法都需要用到它。在为数据恰当选择排序和查找策略时,需要根据数据的规模和类型进行判断。尽管不同策略最终得到的结果完...【详细内容】
2021-11-04  华章科技    Tags:排序算法   点击:(40)  评论:(0)  加入收藏
这是我在网上找的资源的一个总结,会先给出一个我看了觉得还行的关于算法的讲解,再配上实现的代码: Original author: Bill_Hoo Original Address: http://blog.sina.com.cn/s/bl...【详细内容】
2021-11-04  有AI野心的电工和码农    Tags: KMP算法   点击:(36)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条