⽤python删除⽂件夹中的重复图⽚(图⽚去重)
⽬录
第⼀部分:判断两张图⽚是否相同
第⼆部分:判断⽂件夹内是否有重复图⽚
第三部分:程序运⾏结果
第四部分:注意
第⼀部分:判断两张图⽚是否相同
要查重复的图⽚,必然绕不开判断两张图⽚是否相同。判断两张图⽚简单呀!图⽚可以看成数组,⽐较两个数组是否相等不就⾏了。但是这样做太过简单粗暴,因为两个数组的每个元素都要⼀⼀⽐较,效率很低。为了尽量避免两个庞⼤的数组⽐较:
先进⾏两张图⽚的⼤⼩(byte)⽐较,若⼤⼩不相同,则两张图⽚不相同;
在两张图⽚的⼤⼩相同的前提下,进⾏两张图⽚的尺⼨(长和宽)⽐较,若尺⼨不相同,则两张不相同;
在两张图⽚的尺⼨相同的前提下,进⾏两张图⽚的内容(即数组元素)⽐较,若内容不相同,则图⽚不相同;
这样,当图⽚⼤⼩或图⽚尺⼨不相同的时候,便认为两张图⽚不同,可以省去⽐较数组元素的部分,效率up~
import shutil
import numpy as np
from PIL import Image
import os
def ⽐较图⽚⼤⼩(dir_image1, dir_image2):
with open(dir_image1, "rb") as f1:
size1 = ad())
with open(dir_image2, "rb") as f2:
size2 = ad())
if(size1 == size2):
result = "⼤⼩相同"
else:
result = "⼤⼩不同"
return result
def ⽐较图⽚尺⼨(dir_image1, dir_image2):
image1 = Image.open(dir_image1)
image2 = Image.open(dir_image2)
if(image1.size == image2.size):
result = "尺⼨相同"
else:
result = "尺⼨不同"
return result
def ⽐较图⽚内容(dir_image1, dir_image2):
image1 = np.array(Image.open(dir_image1))
image2 = np.array(Image.open(dir_image2))
if(np.array_equal(image1, image2)):
result = "内容相同"
else:
result = "内容不同"
return result
def ⽐较两张图⽚是否相同(dir_image1, dir_image2):
# ⽐较两张图⽚是否相同
# 第⼀步:⽐较⼤⼩是否相同
# 第⼆步:⽐较长和宽是否相同
# 第三步:⽐较每个像素是否相同
# 如果前⼀步不相同,则两张图⽚必不相同
result = "两张图不同"
⼤⼩ = ⽐较图⽚⼤⼩(dir_image1, dir_image2)
if(⼤⼩ == "⼤⼩相同"):
尺⼨ = ⽐较图⽚尺⼨(dir_image1, dir_image2)
if(尺⼨ == "尺⼨相同"):
内容 = ⽐较图⽚内容(dir_image1, dir_image2)
if(内容 == "内容相同"):
result = "两张图相同"
return result
第⼆部分:判断⽂件夹内是否有重复图⽚
若要判断⽂件夹内是否有和图⽚A相同的图⽚,则需要遍历⽂件夹内所有图⽚,挨个判断两个图⽚是否相同。若⽂件夹有1000张图⽚,那么第1张图⽚需要与剩下的999张图⽚作⽐较,第2张图⽚需要与剩下的998张图⽚作⽐较,第3张需要与剩下的997张图⽚作⽐较,以此类推。在此程序中的做法是,先对所有图⽚按图⽚⼤⼩(byte)排序,然后再执⾏遍历⽐较。这样做的结果是:重复图⽚很⼤概率会连着出现(因为重复图⽚⼤⼩相同)
if __name__ == '__main__':
load_path = 'E:\\测试图⽚集(未去重)' # 要去重的⽂件夹
save_path = 'E:\\测试图⽚集(重复照⽚)' # 空⽂件夹,⽤于存储检测到的重复的照⽚
os.makedirs(save_path, exist_ok=True)django项目实例
# 获取图⽚列表 file_map,字典{⽂件路径filename : ⽂件⼤⼩image_size}
file_map = {}
image_size = 0
# 遍历filePath下的⽂件、⽂件夹(包括⼦⽬录)
for parent, dirnames, filenames in os.walk(load_path):
# for dirname in dirnames:
# print('parent is %s, dirname is %s' % (parent, dirname))
for filename in filenames:
# print('parent is %s, filename is %s' % (parent, filename))
# print('the full name of the file is %s' % os.path.join(parent, filename))
image_size = size(os.path.join(parent, filename))
file_map.setdefault(os.path.join(parent, filename), image_size)
# 获取的图⽚列表按⽂件⼤⼩image_size 排序
file_map = sorted(file_map.items(), key=lambda d: d[1], reverse=False)
file_list = []
for filename, image_size in file_map:
file_list.append(filename)
# 取出重复的图⽚
file_repeat = []
for currIndex, filename in enumerate(file_list):
dir_image1 = file_list[currIndex]
dir_image2 = file_list[currIndex + 1]
result = ⽐较两张图⽚是否相同(dir_image1, dir_image2)
if(result == "两张图相同"):
file_repeat.append(file_list[currIndex + 1])
print("\n相同的图⽚:", file_list[currIndex], file_list[currIndex + 1])
else:
print('\n不同的图⽚:', file_list[currIndex], file_list[currIndex + 1])
currIndex += 1
if currIndex >= len(file_list)-1:
break
# 将重复的图⽚移动到新的⽂件夹,实现对原⽂件夹降重
for image in file_repeat:
print("正在移除重复照⽚:", image)
第三部分:程序运⾏结果
若⽂件夹下有10张图⽚A、5张图⽚B、1张图⽚C,程序运⾏结束后,该⽂件夹下剩余1张图⽚A、1张图⽚B、1张图⽚C;其他的图⽚移动到 save_path 指定的⽂件夹下。
第四部分:注意
程序代码可以直接复制使⽤,需要修改 load_path 和 save_path 参数;
保证 load_path ⽂件夹都为图⽚格式(.jpg .png .jpeg)的⽂件类型,不可以有其他格式的⽂件(例如.mp4);请先⽤资源管理器处理⽂件夹,⼤佬直接修改代码读取⽂件夹下指定类型的⽂件;
以上就是⽤python删除⽂件夹中的重复图⽚的详细内容,更多关于python 删除重复图⽚的资料请关注其它相关⽂章!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论