python查找相似图片或重复图片
1.查找重复图片
利用文件的MD5值可查找完全一样的重复图片
import os,time,hashlib
def getmd5(file):
if not os.path.isfile(file):
return
fd = open(file,'rb')
md5 = hashlib.md5()
md5.update(fd.read())
fd.close()
return md5.hexdigest()
if __name__ == "__main__":
allfile = []
md5list = []
list_delete = []
start = time.time()
path = 'D:\\_PLAY\\新建文件夹\\'
for filepath,dir,filelist in os.walk(path):
for filename in filelist:
allfile.append(os.path.join(filepath,filename))
#根据MD5值比较
for photo in allfile:
md5sum = getmd5(photo)
if md5sum not in md5list:
md5list.append(md5sum)
else:
list_delete.append(photo)
print('重复的照片有:',list_delete)
#删除图片
for i in range(len(list_delete)):
os.remove(list_delete[i])
二.查找相似图片
本文采用四种哈希值进行比较:
1.感知哈希(perception hashing)
2.平均散列(average hashing)
3.梯度散列(difference hashing)
4.离散小波变换(wavelet hashing)
import os,imagehash
from PIL import Image
def hash(path):
highfreq_factor = 4 # resize的尺度
hash_size = 32 # 最终返回hash数值长度
image_scale = 64
img_size = hash_size * highfreq_factor
list_file = []
list_phash = []
list_ahash = []
list_dhash = []
list_whash = []
for file in os.listdir(path):
if os.path.splitext(file)[1] == '.jpg':
path_file = os.path.join(path, file) # 拼路径
list_file.append(file)
phash = imagehash.phash(Image.open(path_file),hash_size=hash_size,highfreq_factor=highfreq_factor)#感知哈希(perception hashing)
ahash = imagehash.average_hash(Image.open(path_file),hash_size=hash_size)#平均散列(average hashing)
dhash = imagehash.dhash(Image.open(path_file),hash_size=hash_size)#梯度散列(difference hashing)
whash = imagehash.whash(Image.open(path_file),image_scale=image_scale,hash_size=hash_size,mode = 'db4')#离散小波变换(wavelet hashing)
list_phash.append(phash)
list_ahash.append(ahash)
list_dhash.append(dhash)
list_whash.append(whash)
#print(list_hash)
for i in range(len(list_file)):
for j in range(i+1,len(list_file)):
phash_value = 1-(list_phash[i]-list_phash[j])/len(list_phash[i].hash)**2
ahash_value = 1-(list_ahash[i]-list_ahash[j])/len(list_ahash[i].hash)**2
dhash_value = 1-(list_dhash[i]-list_dhash[j])/len(list_dhash[i].hash)**2
whash_value = 1-(list_whash[i]-list_whash[j])/len(list_whash[i].hash)**2
value_hash = max(phash_value,ahash_value,dhash_value,whash_value)
if(value_hash > 0.9):#阈值设为0.9
size_i = os.path.getsize(path + '\\' + list_file[i])
size_j = os.path.getsize(path + '\\' + list_file[j])
print(list_file[i],str(size_i/1024)+'KB')
print(list_file[j],str(size_j/1024)+'KB')
print(value_hash)
print('***********************')
if __name__ == '__main__':
path = r'D:\_PLAY\新建文件夹\Excel\ALL_Daily'
hash(path)
python查找相似图片或重复图片的更多相关文章
- Python脚本:删除文件夹下的重复图片,实现图片去重
近期在整理相册的时候,发现相册中有许多重复图片,人工一张张筛查删除太枯燥,便写下这个脚本,用于删除文件夹下重复的图片. 第一部分:判断两张图片是否相同 要查找重复的图片,必然绕不开判断两张图片是否相同 ...
- arp协议分析&python编程实现arp欺骗抓图片
arp协议分析&python编程实现arp欺骗抓图片 序 学校tcp/ip协议分析课程老师布置的任务,要求分析一种网络协议并且研究安全问题并编程实现,于是我选择了研究arp协议,并且利用pyt ...
- Android ListView滑动过程中图片显示重复错乱闪烁问题解决
最新内容建议直接访问原文:Android ListView滑动过程中图片显示重复错乱闪烁问题解决 主要分析Android ListView滚动过程中图片显示重复.错乱.闪烁的原因及解决方法,顺带提及L ...
- 在xml中使用图片资源时,设置重复图片而不是拉伸平铺
直接把图片放入xml中时,默认会拉伸图片填充.而用下面的方法则可以实现重复图片 <?xml version="1.0" encoding="utf-8"? ...
- iOS多线程自定义operation加载图片 不重复下载图片
摘要:1:ios通过抽象类NSOperation封装了gcd,让ios的多线程变得更为简单易用: 2:耗时的操作交给子线程来完成,主线程负责ui的处理,提示用户的体验 2:自定义operati ...
- AndroidListview 滑动过程中图片显示重复错乱解决方案
主要分析Android中Listview滚动过程造成的图片显示重复.错乱.闪烁的原因及解决方法,顺便跟进Listview的缓存机制. 1.原因分析 Listview item 缓存机制:为了使得性能更 ...
- python爬取某个网页的图片-如百度贴吧
python爬取某个网页的图片-如百度贴吧 作者:vpoet mail:vpoet_sir@163.com 注:随意copy,不用告诉我 #coding:utf-8 import urllib imp ...
- Android在ListView显示图片(重复混乱闪烁问题)
Android在ListView显示图片(重复混乱闪烁问题) 1.原因分析 ListView item缓存机制: 为了使得性能更优,ListView会缓存行item(某行相应的View). ListV ...
- 测试开发Python培训:实现屌丝的图片收藏愿望(小插曲)
测试开发Python培训:实现屌丝的图片收藏愿望(小插曲) 男学员在学习python的自动化过程中对于爬虫很感兴趣,有些学员就想能收藏一些图片,供自己欣赏.作为讲师只能是满足愿望,帮助大家实现对美的追 ...
随机推荐
- 成为 Apache 贡献者,从提交第一个简单 PR 开始!
开源之路,PR 走起 ! ---全球最大同性交友社区 1 fork 以下实例以 incubator-dolphinscheduler 海豚调度为例进行操作 从远端仓库* https://github. ...
- 详解ConCurrentHashMap源码(jdk1.8)
ConCurrentHashMap是一个支持高并发集合,常用的集合之一,在jdk1.8中ConCurrentHashMap的结构和操作和HashMap都很类似: 数据结构基于数组+链表/红黑树. ge ...
- 巨细靡遗流程控制,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang流程结构详解EP09
流程结构就是指程序逻辑到底怎么执行,进而言之,程序执行逻辑的顺序.众所周知,程序整体都是自上由下执行的,但有的时候,又不仅仅是从上往下执行那么简单,大体上,Go lang程序的流程控制结构一共有三种: ...
- [Android开发学iOS系列] 工具篇: Xcode使用和快捷键
[Android开发学iOS系列] 工具篇: Xcode使用和快捷键 工欲善其事必先利其器. 编辑 Cmd + N: 新建文件 Option + Cmd + N: 新建文件夹 Cmd + / : 注释 ...
- ThreadLocal for Golang
背景 由于官方不支持 ThreadLocal,在业务中传参经常需要传递 context,造成参数混乱,开发效率低下,跨方法实现传参变得困难. 需要解决的核心问题: 1. 数据存储,g.labels u ...
- MySQL源码分析之SQL函数执行
1.MySQL中执行一条SQL的总体流程 2.SQL函数执行过程 1.MySQL中执行一条SQL的总体流程 一条包含函数的SQL语句,在mysql中会经过: 客户端发送,服务器连接,语法解析,语句执行 ...
- C#基础_变量的命名规则
变量: 1.作用 :可以让我们在计算机中存储数据 2.语法:变量类型 变量名=赋值: 3.常用的数据类型: int 整数类型 取值范围:最大2147483647;最小-214748364 ...
- identity4 系列————持久化配置篇[五]
前言 上面已经介绍了3个例子了,并且介绍了如何去使用identity. 但是在前面的例子中,我们使用的都是在内存中操作,那么正式上线可能需要持久到数据库中. 这里值得说明的是,并不一定一定要持久化到数 ...
- Python入门系列(三)一学就会-基础数据类型
数据类型 您可以使用type()函数获取任何对象的数据类型. x = 5 print(type(x)) 数字类型 x = 1 # int y = 2.8 # float z = 1j # comple ...
- 小样本利器3. 半监督最小熵正则 MinEnt & PseudoLabel代码实现
在前两章中我们已经聊过对抗学习FGM,一致性正则Temporal等方案,主要通过约束模型对细微的样本扰动给出一致性的预测,推动决策边界更加平滑.这一章我们主要针对低密度分离假设,聊聊如何使用未标注数据 ...