用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列表与元组详解实例
Nov 01 Python
python创建和删除目录的方法
Apr 29 Python
Python实现根据IP地址和子网掩码算出网段的方法
Jul 30 Python
Python 类的特殊成员解析
Jun 20 Python
Python常见数据类型转换操作示例
May 08 Python
详解python中的生成器、迭代器、闭包、装饰器
Aug 22 Python
对django layer弹窗组件的使用详解
Aug 31 Python
Python实现微信机器人的方法
Sep 06 Python
python实现高斯(Gauss)迭代法的例子
Nov 20 Python
Python+OpenCV 实现图片无损旋转90°且无黑边
Dec 12 Python
pip安装tensorflow的坑的解决
Apr 19 Python
浅析Python迭代器的高级用法
Jul 16 Python
Pyhton模块和包相关知识总结
python 下划线的多种应用场景总结
May 12 #Python
超级详细实用的pycharm常用快捷键
pycharm 如何查看某一函数源码的快捷键
教你使用Pandas直接核算Excel中快递费用
用python开发一款操作MySQL的小工具
May 12 #Python
浅谈Python类的单继承相关知识
May 12 #Python
You might like
php中$_SERVER[PHP_SELF] 和 $_SERVER[SCRIPT_NAME]之间的区别
2009/09/05 PHP
PHP SEO优化之URL优化方法
2011/04/21 PHP
PHP句法规则详解 入门学习
2011/11/09 PHP
Yii2实现ActiveForm ajax提交
2017/05/26 PHP
ThinkPHP 3.2.3实现页面静态化功能的方法详解
2017/08/03 PHP
wordpress自定义标签云与随机获取标签的方法详解
2019/03/22 PHP
基于jQuery的history历史记录插件
2010/12/11 Javascript
jQuery控制图片的hover效果(smartRollover.js)
2012/03/18 Javascript
jQuery输入城市查看地图使用介绍
2013/05/08 Javascript
Webpack 实现 Node.js 代码热替换
2015/10/22 Javascript
JS实现浏览器打印、打印预览示例
2017/02/28 Javascript
利用require.js与angular搭建spa应用的方法实例
2017/07/19 Javascript
Vue仿支付宝支付功能
2018/05/25 Javascript
vue 使用html2canvas将DOM转化为图片的方法
2018/09/11 Javascript
vue 强制组件重新渲染(重置)的两种方案
2019/10/29 Javascript
vue实现淘宝购物车功能
2020/04/20 Javascript
uin-app+mockjs实现本地数据模拟
2020/08/26 Javascript
vue中选中多个选项并且改变选中的样式的实例代码
2020/09/16 Javascript
[01:04:39]OG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python自动12306抢票软件实现代码
2018/02/24 Python
PyQt5每天必学之日历控件QCalendarWidget
2018/04/19 Python
python实现接口并发测试脚本
2019/06/25 Python
浅谈OpenCV中的新函数connectedComponentsWithStats用法
2020/07/05 Python
简单了解如何封装自己的Python包
2020/07/08 Python
解决pycharm 格式报错tabs和space不一致问题
2021/02/26 Python
HTML5中微数据概述及在搜索引擎中的使用举例
2013/02/07 HTML / CSS
2014年计算机专业个人自我评价
2014/01/19 职场文书
城市规划应届生推荐信
2014/09/08 职场文书
庆六一宣传标语
2014/10/08 职场文书
2014年食品安全工作总结
2014/12/04 职场文书
交警失职检讨书
2015/01/26 职场文书
打架检讨书
2015/01/27 职场文书
小学体育组工作总结
2015/08/13 职场文书
党员观看《筑梦中国》心得体会
2016/01/18 职场文书
人为什么会“幸灾乐祸”?
2019/08/06 职场文书
python某漫画app逆向
2021/03/31 Python