一、图片相似度检测算法原理
我们日常中处理的数据大多数是文本和图片,既然文本有文本相似度,图片肯定也有图片相似度呀,是不是。下面介绍图片相似度检测的算法:检查两个图片的相似度,一个简单而快速的算法:感知哈希算法(Perceptual Hash),通过某种提取特征的方式为每个图片计算一个指纹(哈希),这样对比两个图片相似与否就变成了对比两个指纹异同的问题。
二、应用

  • 相似图片搜索
  • 图片相似度比较
  • 百度识图
  • 图片比较

三、实现步骤和思路

Step1.缩小尺寸

将图片缩小到8*8的大小,这样做可以去除图片的细节,只保留结构和明暗等基本信息,同时摒弃不同尺寸和比例带来的图片差异。

Step2.灰度处理

把缩小后的图片转化为64级灰度图(每个像素只有64种颜色)。

Step3.计算平均值

计算所有64个像素的灰度平均值。

Step4.计算哈希

这里哈希的计算方法是:上面说的64个像素的灰度与平均值进行比较,大于或等于平均值记为1,小于记为0。

将每个像素的比较结果组合在一起成为一个64位的二进制整数,这个整数就是此图片的指纹。

Step5.对比哈希

不同图片对比的方法,就是对比它们的64位哈希中,有多少位不一样(汉明距离)。一般来说如果不同的位数不超过5,就说明两张图片很相似,如果大于10,就很可能是两张不同的图片。

这种算法的优点是简单快速,不受图片大小缩放的影响,缺点是图片的内容不能变更。如果在图片上加几个文字,它就认不出来了。所以,它的最佳用途是根据缩略图,找出原图。


# -*- coding:utf-8 -*-from functools import reduce
from PIL import Image# 计算图片的局部哈希值--pHash
def phash(img):""":param img: 图片:return: 返回图片的局部hash值"""img = img.resize((8, 8), Image.ANTIALIAS).convert('L')avg = reduce(lambda x, y: x + y, img.getdata()) / 64.hash_value=reduce(lambda x, y: x | (y[1] << y[0]), enumerate(map(lambda i: 0 if i < avg else 1, img.getdata())), 0)print(hash_value)return hash_value# 计算汉明距离:
def hamming_distance(a, b):""":param a: 图片1的hash值:param b: 图片2的hash值:return: 返回两个图片hash值的汉明距离"""hm_distance=bin(a ^ b).count('1')print(hm_distance)return hm_distance# 计算两个图片是否相似:
def is_imgs_similar(img1,img2):""":param img1: 图片1:param img2: 图片2:return:  True 图片相似  False 图片不相似"""return True if hamming_distance(phash(img1),phash(img2)) <= 5 else Falseif __name__ == '__main__':# 读取图片sensitive_pic = Image.open("3.jpg")target_pic = Image.open("4.jpg")# 比较图片相似度result=is_imgs_similar(target_pic, sensitive_pic)print(result)

两张不同的图片3和4运行结果:

15824809348783249859
18411139146200482779
24
FalseProcess finished with exit code 0

两张一样的图片1和2运行结果:

14384397865107178495
14384397865107178495
0
TrueProcess finished with exit code 0

封装计算相似度python实现:

# -*- encoding=utf-8 -*-from functools import reduce
from PIL import Image# 这种算法的优点是简单快速,不受图片大小缩放的影响,
# 缺点是图片的内容不能变更。如果在图片上加几个文字,它就认不出来了。
# 所以,它的最佳用途是根据缩略图,找出原图。# 计算图片的局部哈希值--pHash
def phash(img):""":param img: 图片:return: 返回图片的局部hash值"""img = img.resize((8, 8), Image.ANTIALIAS).convert('L')avg = reduce(lambda x, y: x + y, img.getdata()) / 64.hash_value=reduce(lambda x, y: x | (y[1] << y[0]), enumerate(map(lambda i: 0 if i < avg else 1, img.getdata())), 0)return hash_value# 自定义计算两个图片相似度函数局部敏感哈希算法
def phash_img_similarity(img1_path,img2_path):""":param img1_path: 图片1路径:param img2_path: 图片2路径:return: 图片相似度"""# 读取图片img1 = Image.open(img1_path)img2 = Image.open(img2_path)# 计算两个图片的局部哈希值# 计算局部敏感哈希值img1_phash = str(phash(img1))img2_phash = str(phash(img2))# 打印局部敏感哈希值print(img1_phash)print(img2_phash)# 计算汉明距离distance = bin(phash(img1) ^ phash(img2)).count('1')print(distance)print(max(len(bin(phash(img1))), len(bin(phash(img1)))))similary = 1 - distance / max(len(bin(phash(img1))), len(bin(phash(img1))))print("两张图片相似度为:%s" % similary)if __name__ == '__main__':img1_path = r'F:\img_spam\test\3.png'img2_path = r'F:\img_spam\test\4.png'similary = phash_img_similarity(img1_path, img2_path)
E:\laidefa\python.exe F:/文本标签/图片反垃圾/感知哈希算法计算图片相似度.py
18446604991956385279
18446604991956385279
0
66
两张图片相似度为:1.0Process finished with exit code 0

【python 图片搜索】python 快速计算两个图片的相似度相关推荐

  1. 通过计算两个句子的相似度进行文件命批量修改

    问题背景 批量下载文档的时候未能自动的命名,导致文件整理比较麻烦:除了文档外,还下载了文档索引文件,如下所示: 索引信息(TXT文件) 文档信息(PDF文件) 问题需求 通过利用索引信息,匹配索引文档 ...

  2. Python实现电阻计算器——快速计算电阻值

    Python实现电阻计算器--快速计算电阻值 在电子工程领域,电阻器是一种常用的电路元件,而对于电阻值的计算也是非常重要的.本文将介绍如何使用Python编写一个简单的电阻计算器,以帮助电子工程爱好者 ...

  3. 名词解释 算法的有限性_欲借助 FFT 算法快速计算两有限长序列的线性卷积,则过程中要调用 ( ) 次 FFT 算法_学小易找答案...

    [单选题]计算 N=2 L ( L 为整数)点的按时间抽取基 -2FFT 需要 ( ) 级蝶形运算 [单选题]Les étudiants chinois, une fois arrivés en Fr ...

  4. CV之FR之MTCNN:基于TF框架利用MTCNN算法检测并对齐人脸图像进(人脸识别/人脸相似度)而得出人脸特征向量从而计算两张人脸图片距离案例应用之详细攻略

    CV之FR之MTCNN:基于TF框架利用MTCNN算法检测并对齐人脸图像进(人脸识别/人脸相似度)而得出人脸特征向量从而计算两张人脸图片距离案例应用之详细攻略 目录 基于TF框架利用MTCNN算法检测 ...

  5. 使用face_recognition:摄像头实时给人脸打马赛克、疲劳检测、活体检测(张嘴检测)、计算两张人脸之间的相似度、人脸校准

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 使用face_recognition进行摄像头实时给人脸打马赛 ...

  6. 编程之美3.3 计算两个字符串的相似度

          假如有两个字符串分别是:abcd,bbcd,那么,这两个字符串不相同的字符个数是1,即第一个字符时不相同的,定义字符串的相似度为 1 / (x + 1),其中,x 就是不相同的字符个数. ...

  7. C++/JAVA 计算两篇文章的相似度

    C++/JAVA 计算两篇文章的相似度 这位少侠,要不要进店瞧瞧? 实验介绍及思路 问题描述: 编写程序,计算任意两篇文章的相似度. 基本思路: 利用余弦相似度来计算其相似度. 完整代码 C++ 代码 ...

  8. 计算两组标签/关键词 相似度算法

    原文连接 http://www.zhaochao.net/index.php/2016/02/05/14/ 写作背景 标签在互联网行业有大量的应用,给博客打标签,给商品打标签,给新闻打标签.通常每篇文 ...

  9. python余弦定理_使用余弦定理计算两篇文章的相似性

    使用余弦定理计算两篇文章的相似性:(方法论,细致易懂版) http://blog.csdn.net/dearwind153/article/details/52316151 python 实现(代码) ...

最新文章

  1. SAP SM12 解锁Lock Table
  2. 非科班Java尝试全国高校计算机能力挑战赛第三届计挑赛
  3. vue 过滤器 filters
  4. CPU 是如何工作的?
  5. Win10下Eclipse运行环境的安装
  6. 自学python后自己接单-自学Python 后端一年半,如何写简历包装自己得到面试机会?...
  7. Dot net GC
  8. Java程序开发的基本流程是什么样的?
  9. Anylogic学习--------------三维窗口
  10. AI 智能写作与智能写诗
  11. linux free空闲内存用尽,Linux中显示空闲内存空间的free命令的基本用法,linuxfree...
  12. Array Shrinking(区间DP)
  13. UltraISO软碟通制作U盘时显示:请格式化U盘后再试。
  14. 最长上升子序列(O(nlogn))算法并输出最长上升子序列
  15. ionic知识系列:Could not remove dir ‘/data/data/io.ionic.starter/code_cache/.ll/‘
  16. 项目分享|小师弟手把手教你用蓝牙模块
  17. 平面设计中的网格系统pdf_【200421】平面设计必看书籍超越平凡的设计平面设计中的网格系统等|电子书资源免费分享...
  18. 用户登录 JWT TOKEN
  19. ssoj1338蜘蛛侠 trampolin
  20. markdown设置图片相对路径显示

热门文章

  1. 化学中计算机模拟试题,计算机在化学中的应考试试卷-2015.doc
  2. 阿里EasyExcel读写excel文件的基本使用
  3. BaseActivity 中使用广播接收器时,onReceive 会多次执行
  4. 二叉树part8 | ● 235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树中的插入操作 ● 450.删除二叉搜索树中的节点
  5. CSS 中 !important的用法总结
  6. 通用Dao模板--所有表一个模板即可
  7. 【Windows系统】查询特定进程TCP端口
  8. 微信小程序请求数据报错: 如若已在管理后台更新域名配置,请刷新项目配置后重新编译项目,操作路径:“详情-域名信息”
  9. 联想凌拓芯片设计行业存储解决方案
  10. 中民协元宇宙工委副秘书长高泽龙出席2021中关村大数据联盟年会