用python删除文件夹中的重复图片(图片去重)


Posted in Python onMay 12, 2021

第一部分:判断两张图片是否相同

要查找重复的图片,必然绕不开判断两张图片是否相同。判断两张图片简单呀!图片可以看成数组,比较两个数组是否相等不就行了。但是这样做太过简单粗暴,因为两个数组的每个元素都要一一比较,效率很低。为了尽量避免两个庞大的数组比较:

  • 先进行两张图片的大小(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 = len(f1.read())
    with open(dir_image2, "rb") as f2:
        size2 = len(f2.read())
    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)

    # 获取图片列表 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 = os.path.getsize(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:
        shutil.move(image, save_path)
        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 删除重复图片的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python实现的石头剪子布代码分享
Aug 22 Python
python中Flask框架简单入门实例
Mar 21 Python
详尽讲述用Python的Django框架测试驱动开发的教程
Apr 22 Python
python实现比较两段文本不同之处的方法
May 30 Python
Python中for循环控制语句用法实例
Jun 02 Python
详解python eval函数的妙用
Nov 16 Python
numpy.where() 用法详解
May 27 Python
对python tkinter窗口弹出置顶的方法详解
Jun 14 Python
你还在@微信官方?聊聊Python生成你想要的微信头像
Sep 25 Python
Django-silk性能测试工具安装及使用解析
Nov 28 Python
使用python将微信image下.dat文件解密为.png的方法
Nov 30 Python
python 基于opencv操作摄像头
Dec 24 Python
Pyhton模块和包相关知识总结
python 下划线的多种应用场景总结
May 12 #Python
超级详细实用的pycharm常用快捷键
pycharm 如何查看某一函数源码的快捷键
教你使用Pandas直接核算Excel中快递费用
用python开发一款操作MySQL的小工具
May 12 #Python
浅谈Python类的单继承相关知识
May 12 #Python
You might like
PHP安全性漫谈
2012/06/28 PHP
Thinkphp模板中使用自定义函数的方法
2012/09/23 PHP
ThinkPHP之M方法实例详解
2014/06/20 PHP
Yii2结合Workerman的websocket示例详解
2018/09/10 PHP
IE8 原生JSON支持
2009/04/13 Javascript
javascript针对DOM的应用实例(一)
2012/04/15 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(一)让静态人物动起来
2013/01/23 Javascript
jQuery实现点击标题输入详细信息
2013/04/16 Javascript
js中style.display=""无效的解决方法
2014/10/30 Javascript
基于javascript实现漂亮的页面过渡动画效果附源码下载
2015/10/26 Javascript
第一次接触JS require.js模块化工具
2016/04/17 Javascript
基于JavaScript实现自动更新倒计时效果
2016/12/19 Javascript
Node.js中.pfx后缀文件的处理方法
2017/03/10 Javascript
ES6入门教程之Iterator与for...of循环详解
2017/05/17 Javascript
详解JavaScript数组过滤相同元素的5种方法
2017/05/23 Javascript
Angular通过angular-cli来搭建web前端项目的方法
2017/07/27 Javascript
vue-cli下的vuex的简单Demo图解(实现加1减1操作)
2018/02/26 Javascript
微信小程序input框中加入小图标的实现方法
2018/06/19 Javascript
layui之table checkbox初始化时选中对应选项的方法
2019/09/02 Javascript
详解如何在JS代码中消灭for循环
2019/12/11 Javascript
jquery实现直播视频弹幕效果
2020/02/25 jQuery
es6函数之rest参数用法实例分析
2020/04/18 Javascript
[00:17]游戏风云独家报道:DD赛后说出数字秘密 吓死你们啊!
2014/07/13 DOTA
[02:54]辉夜杯主赛事第二日败者组 iG.V赛后采访
2015/12/26 DOTA
Python实现的当前时间多加一天、一小时、一分钟操作示例
2018/05/21 Python
pandas 条件搜索返回列表的方法
2018/10/30 Python
Python面向对象程序设计类变量与成员变量、类方法与成员方法用法分析
2019/04/12 Python
python选取特定列 pandas iloc,loc,icol的使用详解(列切片及行切片)
2019/08/06 Python
python线程的几种创建方式详解
2019/08/29 Python
python的pip有什么用
2020/06/17 Python
美国家喻户晓的保健品品牌:Vitamin World(维他命世界)
2016/08/19 全球购物
龟牌英国商店:Turtle Wax Brand Store UK
2019/07/02 全球购物
请写出 BOOL flag 与"零值"比较的 if 语句
2016/02/29 面试题
老人祝寿主持词
2014/03/28 职场文书
领导干部保密承诺书
2014/08/30 职场文书
村主任“四风”问题个人对照检查材料思想汇报
2014/10/02 职场文书