【python 图片搜索】python 快速计算两个图片的相似度
一、图片相似度检测算法原理
我们日常中处理的数据大多数是文本和图片,既然文本有文本相似度,图片肯定也有图片相似度呀,是不是。下面介绍图片相似度检测的算法:检查两个图片的相似度,一个简单而快速的算法:感知哈希算法(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 快速计算两个图片的相似度相关推荐
- 通过计算两个句子的相似度进行文件命批量修改
问题背景 批量下载文档的时候未能自动的命名,导致文件整理比较麻烦:除了文档外,还下载了文档索引文件,如下所示: 索引信息(TXT文件) 文档信息(PDF文件) 问题需求 通过利用索引信息,匹配索引文档 ...
- Python实现电阻计算器——快速计算电阻值
Python实现电阻计算器--快速计算电阻值 在电子工程领域,电阻器是一种常用的电路元件,而对于电阻值的计算也是非常重要的.本文将介绍如何使用Python编写一个简单的电阻计算器,以帮助电子工程爱好者 ...
- 名词解释 算法的有限性_欲借助 FFT 算法快速计算两有限长序列的线性卷积,则过程中要调用 ( ) 次 FFT 算法_学小易找答案...
[单选题]计算 N=2 L ( L 为整数)点的按时间抽取基 -2FFT 需要 ( ) 级蝶形运算 [单选题]Les étudiants chinois, une fois arrivés en Fr ...
- CV之FR之MTCNN:基于TF框架利用MTCNN算法检测并对齐人脸图像进(人脸识别/人脸相似度)而得出人脸特征向量从而计算两张人脸图片距离案例应用之详细攻略
CV之FR之MTCNN:基于TF框架利用MTCNN算法检测并对齐人脸图像进(人脸识别/人脸相似度)而得出人脸特征向量从而计算两张人脸图片距离案例应用之详细攻略 目录 基于TF框架利用MTCNN算法检测 ...
- 使用face_recognition:摄像头实时给人脸打马赛克、疲劳检测、活体检测(张嘴检测)、计算两张人脸之间的相似度、人脸校准
日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 使用face_recognition进行摄像头实时给人脸打马赛 ...
- 编程之美3.3 计算两个字符串的相似度
假如有两个字符串分别是:abcd,bbcd,那么,这两个字符串不相同的字符个数是1,即第一个字符时不相同的,定义字符串的相似度为 1 / (x + 1),其中,x 就是不相同的字符个数. ...
- C++/JAVA 计算两篇文章的相似度
C++/JAVA 计算两篇文章的相似度 这位少侠,要不要进店瞧瞧? 实验介绍及思路 问题描述: 编写程序,计算任意两篇文章的相似度. 基本思路: 利用余弦相似度来计算其相似度. 完整代码 C++ 代码 ...
- 计算两组标签/关键词 相似度算法
原文连接 http://www.zhaochao.net/index.php/2016/02/05/14/ 写作背景 标签在互联网行业有大量的应用,给博客打标签,给商品打标签,给新闻打标签.通常每篇文 ...
- python余弦定理_使用余弦定理计算两篇文章的相似性
使用余弦定理计算两篇文章的相似性:(方法论,细致易懂版) http://blog.csdn.net/dearwind153/article/details/52316151 python 实现(代码) ...
最新文章
- 解决 win10 pycurl安装出错 Command python setup.py egg_info failed with error code 10 编译安装包 安装万金油...
- OC__part11.1
- 数组及字符串相关知识
- unity 检测文本有没有自动换行_python3从零学习-5.1.5、文本自动换行与填充模块textwrap...
- html过滤 -java_PHP过滤各种html标签
- android 退出代码
- [转载] python3文档字符串_python3基础:字符串、文本文件
- 客户端可以连接 .Net程序不能连接SQL Server 2000
- (23)Linux下Clion中搭建opencv环境
- 编译OpenJDK12:链接freelib时提示 LNK4044,无法识别的选项
- 软件管理员密码忘记怎么办?软件密码如何找回?
- arcgis for flex api version3.7 教程:7.使用Directions查询路线(最短路径分析)
- MMS-MTK-Obigo03c
- Linux 中 Permission denied
- python实现自动化查谁没交作业
- insert into bak select * from test会锁表吗
- 计算机PS实验报告范文,PHOTOSHOP实验报告范文
- 微信支付限额问题最详细解答
- 161206 ANFIS 自适应模糊神经网络
- 【ARM】ARM处理器概述